2015-09-01 4 views
0

Я хочу показать данные из базы данных в ListView, и я попытался использовать rawQuery и запрос для этого.Невозможность получить данные из SQLite в ListView

Это нормально показать данные с помощью rawQuery, но при нажатии кнопки ничего не происходит. Приложение может выполняться без ошибок и просто не показывать данные по запросу.

У меня есть он googled и проверен на Android-разработчике для некоторых подсказок, но, похоже, руководство должно быть выполнено. Я был бы признателен, если бы кто-то мог сообщить мне, что пошло не так, когда я использую запрос для получения данных. Почему данные не отображаются в ListView?

Update # Я попытался изменить выбор, как показано ниже, но до сих пор не могу получить данные

первого изменения: выбор изменился, арг выбора = NULL

String selection = "Phone=1234567890"; 
Cursor cursor = dbRead.query(ContactContract.ContactEntry.TABLE_NAME, 
             projection, selection, null, null, null, sortOrder); 

2-ое изменение:

String selection = "Phone=?"; 
String[] selectionArgs = {"1234567890"}; 
Cursor cursor = dbRead.query(ContactContract.ContactEntry.TABLE_NAME, 
             projection, selection, selectionArgs, null, null, sortOrder); 

Вот слушатель:

 public void onClick(View v) { 
     LinearLayout Layout_record = (LinearLayout) findViewById(R.id.layout_record); 
     ListView listView = new ListView(MainActivity.this); 
     Button btn = (Button) v; 
     Button btn_submit = (Button) findViewById(R.id.btn_submit); 
     Button btn_count = (Button) findViewById(R.id.btn_count); 
     Button btn_showAll = (Button) findViewById(R.id.btn_showAll); 
     TextView tv_count = (TextView) findViewById(R.id.tv_count); 
     ContactDBHelper mDBHelper = new ContactDBHelper(getApplicationContext()); 
     SQLiteDatabase dbWrite = mDBHelper.getWritableDatabase(); 
     SQLiteDatabase dbRead = mDBHelper.getReadableDatabase(); 

     String[] projection = { 
       ContactContract.ContactEntry._ID, 
       ContactContract.ContactEntry.COLUMN_NAME_CONTACT_NAME, 
       ContactContract.ContactEntry.COLUMN_NAME_CONTACT_PHONE 
     }; 

     String selection = "_ID=? OR Contact=? OR PHONE=?"; 
     String[] selectionArgs = {"ID", "Contact", "Phone"}; 
     String sortOrder = ContactContract.ContactEntry._ID + " DESC"; 

     String queryAll = "SELECT * FROM " + ContactContract.ContactEntry.TABLE_NAME; 

     if(btn==btn_submit) { 

      EditText et_name = (EditText) findViewById(R.id.et_name); 
      EditText et_phone = (EditText) findViewById(R.id.et_phone); 

      String dataName = et_name.getText().toString(); 
      String dataPhone = et_phone.getText().toString(); 

      ContentValues values = new ContentValues(); 
      values.put(ContactContract.ContactEntry.COLUMN_NAME_CONTACT_NAME, dataName); 
      values.put(ContactContract.ContactEntry.COLUMN_NAME_CONTACT_PHONE, dataPhone); 

      Toast.makeText(MainActivity.this, "Loading...", Toast.LENGTH_SHORT).show(); 
      dbWrite.insert(ContactContract.ContactEntry.TABLE_NAME, null, values); 
      Toast.makeText(MainActivity.this, "Completed", Toast.LENGTH_SHORT).show(); 
     } else if (btn==btn_count) { 

     } else { 
//   Cursor cursor = dbRead.rawQuery(queryAll,null); 
      Cursor cursor = dbRead.query(ContactContract.ContactEntry.TABLE_NAME, 
             projection, selection, selectionArgs, null, null, sortOrder); 
      ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1); 

      cursor.moveToFirst(); 
      while (cursor.moveToNext()) { 
       long itemID = cursor.getLong(cursor.getColumnIndexOrThrow(ContactContract.ContactEntry._ID)); 
       String contactName = cursor.getString(cursor.getColumnIndexOrThrow(ContactContract.ContactEntry.COLUMN_NAME_CONTACT_NAME)); 
       int contactPhone = cursor.getInt(cursor.getColumnIndexOrThrow(ContactContract.ContactEntry.COLUMN_NAME_CONTACT_PHONE)); 

       String row = itemID + "-" + contactName + "~" + contactPhone; 
       adapter.add(row); 
      } 
      listView.setAdapter(adapter); 
      Layout_record.addView(listView); 
      dbRead.close(); 

     } 
    } 

Вот контракта базе данных общественного класса ContactContract { общественного ContactContract() {}

public static abstract class ContactEntry implements BaseColumns { 
    public static final String TABLE_NAME = "ContactBook"; 
    public static final String COLUMN_NAME_CONTACT_NAME= "Contact"; 
    public static final String COLUMN_NAME_CONTACT_PHONE = "Phone"; 

    public static final String TEXT_TYPE = " TEXT"; 
    public static final String COMMA_SEP = ","; 
    public static final String SQL_CREATE_ENTRIES = 
      "CREATE TABLE " + ContactEntry.TABLE_NAME + " (" + 
        ContactEntry._ID + " INTEGER PRIMARY KEY," + 
        ContactEntry.COLUMN_NAME_CONTACT_NAME + TEXT_TYPE + COMMA_SEP + 
        ContactEntry.COLUMN_NAME_CONTACT_PHONE + TEXT_TYPE + 
        ")"; 

    public static final String SQL_DELETE_ENTRIES = 
      "DROP TABLE IF EXISTS " + ContactEntry.TABLE_NAME; 
} 

}

+0

dont использовать 'ArrayAdapter', так как ваша модель данных является sqlite db, вместо этого используйте' SimpleCursorAdapter' – pskink

+0

. Хорошо, я попытаюсь использовать SimpleCursorAdapter, но мне интересно, не работает ли ArrayAdapter в этом случае? – TroyKC

ответ

1

я не уверен, что вы пытаетесь сделать с вашим выбором (я не» знаем ваши столбцы таблицы и т.д.), но эти две строки:

String selection = "_ID=? OR Contact=? OR PHONE=?"; 
    String[] selectionArgs = {"ID", "Contact", "Phone"}; 

средние:

Select * from TABLE WHERE _ID="ID" OR Contact="Contact" OR PHONE="Phone"; 

Я не думаю, что это то, что вы имеете в виду ... возможно, попробуйте выбор без каких-либо аргументов, а затем попытайтесь найти строку по ID. Затем строка по контакту (независимо от того, что должен представлять этот столбец).

EDIT:

В дополнение к этой проблеме, вы, вероятно, не вводить данные с вашего insert заявления. Ваш первичный ключ _ID не автоматическое приращение, так что ваша вставка не получится, поэтому изменить создать заявление:

public static final String SQL_CREATE_ENTRIES = 
     "CREATE TABLE " + ContactEntry.TABLE_NAME + " (" + 
       ContactEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
       ContactEntry.COLUMN_NAME_CONTACT_NAME + TEXT_TYPE + COMMA_SEP + 
       ContactEntry.COLUMN_NAME_CONTACT_PHONE + TEXT_TYPE + 
       ")"; 

Вы также можете вручную добавить _ID как в:

 ContentValues values = new ContentValues(); 
     values.put(ContactContract.ContactEntry._ID, dataId); 
     values.put(ContactContract.ContactEntry.COLUMN_NAME_CONTACT_NAME, dataName); 
     values.put(ContactContract.ContactEntry.COLUMN_NAME_CONTACT_PHONE, dataPhone); 

Кроме того, заметим, что ваш «удалить» удаляет таблицу. Вероятно, вы должны просто удалить все строки, как в DELETE * FROM TABLE_NAME, или что-то в этом роде.

+0

аргументы выбора, чтобы уменьшить количество результатов - это не «поиск», он основан на «эквивалентности», что означает, что приведенное выше будет возвращать только строки, где столбец PHONE равен строке «Телефон» - «search» вам нужен PHONE = «1234567890» или что-то в этом роде ... – Jim

+0

Я попытался изменить выбор и запрос, и я обновил изменение в сообщении. Однако по-прежнему не удается получить данные (из столбца с номером телефона 1234567890), и я проверил, что телефон есть. Теперь я хочу попытаться получить данные конкретной строки из базы данных (включая идентификатор, имя контакта, телефон). – TroyKC

Смежные вопросы