2014-03-05 67 views
-1

我有一個應用程序,客戶被記錄並存儲在我的數據庫中。您需要通過按下按鈕,所選聯繫人保留在手機通訊錄中。請幫助。如何從我的應用程序中保存聯繫人,該聯繫人存儲在我的數據庫中的手機聯繫人中?

問題是隻有從數據庫中讀取列名和它們的傳輸,並且我需要通過按下按鈕查看特定聯繫人 - 將聯繫人保存在電話簿中。

這裏試試這個代碼:

public class ViewContactMoy extends Activity { 

    private long rowId; // имя выбранного контакта 
    private TextView nameTV; // отображает имя контакта 
    private TextView phoneTV; // номер телефона контакта 
    private TextView birthdayTV; // дата рождения контакта 
    private TextView passportTV; // паспортные данные контакта 
    private TextView adressTV; // адрес прописки контакта 
    private TextView siteTV; // адрес прописки контакта 
    private TextView noteTV; 

    ContactDBmoy cqh; 
    SQLiteDatabase sdb; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.contact_view_moy); 

     nameTV = (TextView) findViewById(R.id.nameTV); 
     phoneTV = (TextView) findViewById(R.id.phoneTV); 
     birthdayTV = (TextView) findViewById(R.id.birthdayTV); 
     passportTV = (TextView) findViewById(R.id.passportTV); 
     adressTV = (TextView) findViewById(R.id.adressTV); 
     siteTV = (TextView) findViewById(R.id.siteTV); 
     noteTV = (TextView) findViewById(R.id.noteTV); 

     // получение ID строки выбранного контакта 

     Bundle extras = getIntent().getExtras(); 
     rowId = extras.getLong(ContactMain.rowId); 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 

     // создание нового класса LoadContactTask и вызов его 
     new LoadContactTask().execute(rowId); 
    } 

    // выполняет запрос к базе данных за пределами потока GUI 
    private class LoadContactTask extends AsyncTask<Long, Object, Cursor> { 
     ContactDBmoy cqh = new ContactDBmoy(ViewContactMoy.this); 

     // выполнение доступа к базе данных 
     @Override 
     protected Cursor doInBackground(Long... params) { 
      sdb = cqh.getWritableDatabase(); 
      sdb = cqh.getReadableDatabase(); 

      // получение курсора, содержащего все данные выбранной записи 
      return cqh.getOneContact(params[0]); 
     } 

     // использование объекта типа Cursor, возвращаемого методом 
     // doInBackground 
     @Override 
     protected void onPostExecute(Cursor mCursor) { 
      super.onPostExecute(mCursor); 
      SQLiteDatabase sdb = cqh.getReadableDatabase(); 

      mCursor.moveToFirst(); // перемещение к первому элементу 

      // получение индекса столбца для каждого элемента данных 

      int nameIndex = mCursor.getColumnIndex(ContactDBmoy.COLUMN_NAME); 
      int phoneIndex = mCursor.getColumnIndex(ContactDBmoy.COLUMN_PHONE); 
      int birthdayIndex = mCursor 
        .getColumnIndex(ContactDBmoy.COLUMN_BIRTHDAY); 
      int passportIndex = mCursor 
        .getColumnIndex(ContactDBmoy.COLUMN_PASSPORT_SN); 
      int adressIndex = mCursor 
        .getColumnIndex(ContactDBmoy.COLUMN_ADRESS); 
      int siteIndex = mCursor.getColumnIndex(ContactDBmoy.COLUMN_SITE); 
      int noteIndex = mCursor.getColumnIndex(ContactDBmoy.COLUMN_NOTE); 

      // заполнение компонентов TextViews выбранными данными 
      nameTV.setText(mCursor.getString(nameIndex)); 
      phoneTV.setText(mCursor.getString(phoneIndex)); 
      birthdayTV.setText(mCursor.getString(birthdayIndex)); 
      passportTV.setText(mCursor.getString(passportIndex)); 
      adressTV.setText(mCursor.getString(adressIndex)); 
      siteTV.setText(mCursor.getString(siteIndex)); 
      noteTV.setText(mCursor.getString(noteIndex)); 

      mCursor.close(); // закрытие курсора результата 
      sdb.close(); // закрытие подключения к базе данных 

     } 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case R.id.editItem: 
      // создание Intent для запуска AddEditContact 
      Intent addEditContact = new Intent(this, Contact.class); 

      // передача данных выбранного контакта 
      addEditContact.putExtra(ContactMain.rowId, rowId); 
      addEditContact.putExtra(ContactDBmoy.COLUMN_NAME, nameTV.getText()); 
      addEditContact.putExtra(ContactDBmoy.COLUMN_PHONE, 
        phoneTV.getText()); 
      addEditContact.putExtra(ContactDBmoy.COLUMN_BIRTHDAY, 
        birthdayTV.getText()); 
      addEditContact.putExtra(ContactDBmoy.COLUMN_PASSPORT_SN, 
        passportTV.getText()); 
      addEditContact.putExtra(ContactDBmoy.COLUMN_ADRESS, 
        adressTV.getText()); 
      addEditContact.putExtra(ContactDBmoy.COLUMN_SITE, siteTV.getText()); 
      addEditContact.putExtra(ContactDBmoy.COLUMN_NOTE, noteTV.getText()); 
      startActivity(addEditContact); 
      return true; 

     case R.id.deleteItem: 
      deleteContact(); // удаление отображенного контакта 
      return true; 

     case R.id.addContTelefonItem: // добавление контакта в телефон 

      addContact(ContactDBmoy.COLUMN_NAME, ContactDBmoy.COLUMN_PHONE); 


      return true; 

     default: 
      return super.onOptionsItemSelected(item); 

     } 

    } 

    public void addContact(String name, String phone) { 

     SQLiteDatabase sdb = cqh.getWritableDatabase(); 

     ArrayList<ContentProviderOperation> op = new ArrayList<ContentProviderOperation>(); 


     Cursor cursor = sdb.query(true, ContactDBmoy.TABLE_NAME, 
       new String[] { ContactDBmoy.COLUMN_NAME, ContactDBmoy.COLUMN_PHONE }, ContactDBmoy._ID + "=" + rowId, null, 
       null, null, null, null); 



     while (cursor.moveToNext()) { 
      String nameI = cursor.getString(cursor.getColumnIndex(ContactDBmoy.COLUMN_NAME)); 
      String phoneI = cursor.getString(cursor.getColumnIndex(ContactDBmoy.COLUMN_PHONE)); 


     /* Добавляем пустой контакт */ 
     op.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) 
      .withValue(RawContacts.ACCOUNT_TYPE, null) 
      .withValue(RawContacts.ACCOUNT_NAME, null) 
      .build()); 
     /* Добавляем данные имени */ 
     op.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) 
      .withValueBackReference(Data.RAW_CONTACT_ID, 0) 
      .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) 
      .withValue(StructuredName.DISPLAY_NAME, nameI) 
      .build()); 
     /* Добавляем данные телефона */ 
     op.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) 
      .withValueBackReference(Data.RAW_CONTACT_ID, 0) 
      .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE) 
      .withValue(Phone.NUMBER, phoneI) 
      .withValue(Phone.TYPE, Phone.TYPE_MOBILE) 
      .build()); 

     try { 
      getContentResolver().applyBatch(ContactsContract.AUTHORITY, op); 
      Toast.makeText(this, "Добавлен контакт: " + ContactDBmoy.COLUMN_NAME, Toast.LENGTH_SHORT).show(); 
     } catch (Exception e) { 
      Log.e("Exception: ", e.getMessage()); 
     } 
    } 
    } 

    // удаление контакта 
    private void deleteContact() { 
     // создание нового AlertDialog Builder 
     AlertDialog.Builder builder = new AlertDialog.Builder(
       ViewContactMoy.this); 

     builder.setTitle(R.string.confirmTitle); 
     builder.setMessage(R.string.confirmMessage); 

     builder.setPositiveButton(R.string.button_delete, 
       new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int button) { 
         final ContactDBmoy cqh = new ContactDBmoy(
           ViewContactMoy.this); 

         // создание класса AsyncTask, удаляющего контакт 
         // из другого потока, после удаления вызывается finish 
         AsyncTask<Long, Object, Object> deleteTask = new AsyncTask<Long, Object, Object>() { 
          @Override 
          protected Object doInBackground(Long... params) { 
           cqh.deleteContact(params[0]); 
           return null; 
          } 

          @Override 
          protected void onPostExecute(Object result) { 
           finish(); // возврат в AddressBook 
          } 
         }; 

         // вызов класса AsyncTask для удаления контакта с rowID 
         deleteTask.execute(new Long[] { rowId }); 
        } 
       }); 

     builder.setNegativeButton(R.string.button_cancel, null); 
     builder.show(); 
    } 
} 

但同樣的錯誤:

03-05 13:54:21.314: W/dalvikvm(4477): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
03-05 13:54:21.403: E/AndroidRuntime(4477): FATAL EXCEPTION: main 
03-05 13:54:21.403: E/AndroidRuntime(4477): java.lang.NullPointerException 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at ru.zloyel.manager_sutochnoy_arendy_1.ViewContactMoy.addContact(ViewContactMoy.java:185) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at ru.zloyel.manager_sutochnoy_arendy_1.ViewContactMoy.onOptionsItemSelected(ViewContactMoy.java:161) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at android.app.Activity.onMenuItemSelected(Activity.java:2534) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:958) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at com.android.internal.view.menu.ListMenuPresenter.onItemClick(ListMenuPresenter.java:166) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at android.widget.AbsListView.performItemClick(AbsListView.java:1086) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at android.widget.AbsListView$PerformClick.run(AbsListView.java:2859) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at android.widget.AbsListView$1.run(AbsListView.java:3533) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at android.os.Handler.handleCallback(Handler.java:615) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at android.os.Handler.dispatchMessage(Handler.java:92) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at android.os.Looper.loop(Looper.java:137) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
03-05 13:54:21.403: E/AndroidRuntime(4477):  at dalvik.system.NativeStart.main(Native Method) 
+0

什麼是185行? – Raghunandan

+0

'public void addContact(String name,String phone){' \t \t Lin 185 - 'SQLiteDatabase sdb = cqh.getWritableDatabase();' – Zloyel

+0

你還沒有初始化cgh。它的唯一聲明是可變的 – Raghunandan

回答

0
SQLiteDatabase sdb = cqh.getWritableDatabase(); 

cgh未初始化。初始化爲

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.contact_view_moy); 
    cqh = new ContactDBmoy(ViewContactMoy.this); // Initialize once. 
相關問題