Следовал официальной документации Android, но все еще не мог использовать SQLite в приложении - PullRequest
0 голосов
/ 14 июня 2010

Мой класс DBHelper

public class DBHelper extends SQLiteOpenHelper {

 public DBHelper(Context context)
 {
  super(context,"SIMPLE_DB",null,1);
 }

 @Override
 public void onCreate(SQLiteDatabase db) {
  db.execSQL("CREATE TABLE SIMPLE_TABLE ( " + 
    "ID INTEGER PRIMARY KEY " +
    "DESC TEXT);");
 }

 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

 }
}

Занятие

    public class SimpleDatabase extends Activity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            DBHelper dbHelper = new DBHelper(this);
            SQLiteDatabase db = dbHelper.getReadableDatabase();
            db.execSQL("INSERT INTO SIMPLE_TABLE VALUES (NULL, 'test');");
            Cursor cursor = db.rawQuery("SELECT * FROM SIMPLE_TABLE", null);
            TextView text = (TextView)findViewById(R.id.textbox);
            text.setText(cursor.getString(0));
        }

}

Я полагаю, что он потерпел крах (приложение неожиданно остановилось!) В SQLiteDatabase db = ... потому что, если я закомментировал код оттуда до конца, он работал бы нормально. Но я понятия не имею, почему это так. Любая помощь будет оценена.

Ответы [ 3 ]

4 голосов
/ 15 июня 2010

Неважно, разобрался, что я сейчас не так сделал.

db.execSQL("CREATE TABLE SIMPLE_TABLE ( " + "ID INTEGER PRIMARY KEY<comma goes here> " + "DESC TEXT);");

Запятые - это серьезный бизнес. Извините за глупый вопрос.

1 голос
/ 14 июня 2010

Прежде всего вы должны убедиться, что ваш оператор SQL верен. Если sqlite3 находится на вашем пути, вы можете выполнить команду:

$>: sqlite3 testdb.db

после этого вы находитесь в оболочке, где вы можете проверить свои операторы SQL, если они синтаксически верны. (Подсказка: ссылаясь на пример выше: это не правильно).

После этого вы должны правильно управлять курсором, как описано Авророй.

Возможно, вам следует реализовать метод onUpgrade (), например:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS SIMPLE_TABLE");
    onCreate(db);
}
0 голосов
/ 14 июня 2010

Во-первых, чтобы помочь в отладке, обязательно используйте монитор отладки и Журнал. Это сделает вашу жизнь намного проще в долгосрочной перспективе! Если вы используете Eclipse, выберите Window -> Open Perspective -> Other -> DDMS. LogCat покажет вам, что происходит во время работы программы. Документация описывает это здесь . Запустите вашу программу еще раз и посмотрите LogCat. Это должно дать вам больше информации и сказать, какая строка кода дает сбой.

Что касается вашего кода, первое, что я заметил, это то, что после того, как вы вернули курсор назад, вам необходимо вызвать cursor.moveToFirst (); выбрать (первую) строку. Затем, когда вы вызываете cursor.getString (0);, он указывает нулевой столбец нулевой строки. Если вы не вызываете moveToFirst (); тогда ваш cursor.getString (0) собирается получить нулевой столбец -1-й строки и быть ошибкой индекса вне границ. По умолчанию курсор будет начинаться со строки -1.

В зависимости от того, как вы хотите перемещаться по курсору, и сколько результатов / строк вы получите, вам также может понадобиться вызвать cursor.movetoPosition () или cursor.moveToNext (). Ознакомьтесь с документацией по курсорам здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...