Question

I have an application in which customers are recorded and stored in my database. You need to by pressing the button, the selected contact remained in phone contacts. Help please.

The problem is that only reads from the database columns name and their transfers, and I need while in viewing a specific contact by pressing the button - save the contact in the phonebook.

Try this code here:

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();
    }
}

but again an error:

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)
Was it helpful?

Solution

SQLiteDatabase sdb = cqh.getWritableDatabase();

cgh is not initialized. Initialize as

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.contact_view_moy);
    cqh = new ContactDBmoy(ViewContactMoy.this); // Initialize once.
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top