2015-09-19 2 views
-1

Я хочу найти столбец, используя идентификатор.
Эта функция вернет все значения в этой конкретной строке.Поиск столбца с идентификатором в базе данных Sqlite

Вот мой код и журнал.

LOG:

09-19 14:00:54.940  618-618/? **I/SqliteDatabaseCpp﹕ sqlite returned: error code = 1, msg = table IUBConnectivitydata already exists, db=/data/data/com.example.sivs.datacopy/databases/** 
09-19 14:00:54.970  618-618/? E/SQLiteOpenHelper﹕ Couldn't open Database1 for writing (will try read-only): 

Код:

public Cursor Rowdata(String a){ 
     SQLiteDatabase db=this.getReadableDatabase(); 
     Log.d("a4","aaa34"); 
     Cursor cursor1=db.rawQuery("SELECT "+COL_3+", FROM" + TABLE_NAME + "where WBTSID==?",new String[] {a}); 
     Log.d("a3","row"); 
     return cursor1; 
    } 
+1

Прежде чем искать глубже, вы забыли поставить пробел между 'от',' 'TABLE_NAME' и where'. Кроме того, я думаю, вы обнаружите, что в '' WHERE' есть только один '='. – PPartisan

+0

Самая сложная часть журнала - это стек из таблицы ниже «Невозможно открыть Database1 для записи (попробуйте только для чтения):« – e4c5

+0

спасибо e4c5 и PPartisan, я нашел, почему он не может открыться. но теперь он показывает синтаксическую ошибку sqlite. Курсор cursor1 = db.rawQuery («SELECT» + COL_3 + », FROM« + TABLE_NAME + », где WBTSID ==?», Новая строка [] {a}); –

ответ

0

Я бы рекомендовал только один глобальный экземпляр класса вспомогательной базы данных, которые могут быть расположены в расширенном классе приложений. Сам класс-помощник должен содержать экземпляр SQLiteDatabase, который является фактическим объектом базы данных.

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

Это может выглядеть следующим образом:

public MyClass extends Application { 
    private MyDBHelper db; 
    public MyDBHelper getDB() { 
     if (database == null) { 
      db = new MyDBHelper(this); 
     } 
     db.open(); // call getWritableDataBase internally 
     return db; 
    } 
} 

При создании базы данных в SqlLiteHelpers onCreate() обратного вызова, то она должна быть только создал самый первый раз, когда вы открываете приложение после установки.

В обратном вызове SqlLitehelperвы можете активировать ограничения внешнего ключа с помощью setForeignKeyConstrainsEnabled(true), что является важной функцией безопасности. Из coure вы должны объявить внешние ключи с оговорками REFERS().

EDIT: Создание синхронизированного статического экземпляра также возможно (как указано в комментарии ниже). В любом случае вы должны убедиться, что существует только один экземпляр вашего вспомогательного класса базы данных и только один экземпляр самой базы данных. (Который должен быть расположен в классе хелперов базы данных)

+0

Другой способ (и, я бы сказал, более популярный) - создать «статический синхронизированный» singleton' внутри класса MyDBHelper: http://www.androiddesignpatterns.com/2012/05/correctly-managing-your-sqlite -database.html – PPartisan

0

попробовать следующее,

if (c.moveToFirst()){ 
    do{ 
     id = c.getInt(c.getColumnIndex("_id")); 
    }while(cursor.moveToNext()); 
} 

с представляет собой курсор всех данных.

1

Добавлена ​​дополнительная запятая перед FROM, дополнительная = раньше? и забыл 2 пробела вокруг имени таблицы.

Неправильно:

db.rawQuery("SELECT "+COL_3+", FROM" + TABLE_NAME + "where WBTSID==?",new String[] {a}); 

Справа:

db.rawQuery("SELECT "+COL_3+" FROM " + TABLE_NAME + " where WBTSID=?",new String[] {a}); 
Смежные вопросы