Исходные данные поставщика Android

все. Я хочу вставить некоторые исходные данные в базу данных (sqlite) при ее создании.

если нет операций вставки, программа работает нормально. но когда я добавляю его, это вызывает ошибку. Я не могу понять. Кажется, андроид получает читаемый дескриптор базы данных, чтобы написать его? Я не уверена. Или, может быть, Android не позволяет вставлять данные в метод onCreate() DatabaseHelper? надеюсь, что кто-то может решить мою проблему.

  02-16 12:34:20.445: ERROR/AndroidRuntime(24947): Caused by: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 0 to 3: /data/data/com.kbonez.prodo/databases/prodo.db

02-16 12:34:20.445: ERROR/AndroidRuntime(24947):     at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:170)
**02-16 12:34:20.445: ERROR/AndroidRuntime(24947):     at com.kbonez.prodo.ProdoProvider.query(ProdoProvider.java:164)**
02-16 12:34:20.445: ERROR/AndroidRuntime(24947):     at android.content.ContentProvider$Transport.query(ContentProvider.java:130)
02-16 12:34:20.445: ERROR/AndroidRuntime(24947):     at android.content.ContentResolver.query(ContentResolver.java:202)
02-16 12:34:20.445: ERROR/AndroidRuntime(24947):     at android.app.Activity.managedQuery(Activity.java:1495)
02-16 12:34:20.445: ERROR/AndroidRuntime(24947):     at com.kbonez.prodo.ProdoList.onCreate(ProdoList.java:129)

Я смотрю на строку 164, это

SQLiteDatabase db = mOpenHelper.getReadableDatabase();

Я просто добавляю этот код в свой Provider.DatabaseHelper.onCreate().

final String insTemplate="insert into %s (%s,%s)  values (%s);";            

        for(String i: ct.getResources().getStringArray(R.array.helpInit)){
            db.execSQL(String.format(insTemplate,PRODO_TABLE_NAME,Structer.TITLE,Structer.NOTE,i)); 
        }

================================================== ======== решено!

Спасибо всем, ребята, я попробовал. я использую это

    // Get the database and run the query
    try{
    SQLiteDatabase db = mOpenHelper.getReadableDatabase();
    Cursor c = qb.query(db, projection, selection, selectionArgs, null,
            null, orderBy);

    // Tell the cursor what uri to watch, so it knows when its source data
    // changes
    c.setNotificationUri(getContext().getContentResolver(), uri);
    return c;
    }catch(SQLException e){
        SQLiteDatabase db = mOpenHelper.getWritableDatabase();

        return null;
    }

но я не могу понять, почему андроид этого не делает, и нам нужно это сделать.


person 9nix00    schedule 16.02.2011    source источник


Ответы (3)


Для выполнения запроса на вставку вы должны открыть данные в режиме записи.

SQLiteDatabase db = mOpenHelper.getWritableDatabase();
person AlexKorovyansky    schedule 16.02.2011
comment
У меня все еще есть проблема. строка 164 находится в методе query(). вы имеете в виду, если я хочу вставить эти исходные данные. Я должен сначала попытаться получить доступный для записи дескриптор базы данных даже в методе запроса? - person 9nix00; 16.02.2011
comment
В любом случае метод onCreate используется для создания базы данных, поэтому сначала вы должны выполнить CREATE TABLE, а затем, если вы хотите вставить начальные значения, вы должны выполнить INSERT. Внутри onCreate у вас есть параметр дохода SQLiteDatabase db, вам не нужно получать его с помощью mOpenHelper.getReadableDatabase() или mOpenHelper.getWritableDatabase(). - person AlexKorovyansky; 16.02.2011
comment
пожалуйста, проверьте этот пример thinkandroid.wordpress.com/2010/01 /13/ - person AlexKorovyansky; 16.02.2011
comment
да, я знаю. хотя эта прога работает сейчас, но я все еще не могу понять. Я вставляю весь код по адресу paste.pocoo.org/show/339387 и добавляю комментарий, вы можете найти его .use//проблема здесь! если я использую только getReadable , программа вызовет ошибку. - person 9nix00; 16.02.2011
comment
Извините, но я не понимаю причину вашей проблемы. В вашем коде я вижу несколько плохих мест. Например, почему вы пытаетесь поймать SQLException в методе запроса? (строка #173-#177 странная) Думаю, корень проблемы в другом месте. Не подавляйте SQLException и, возможно, вы знаете больше о реальной проблеме (если вы вернете null, система упадет в другом месте, но со странным и странным исключением). Удачи! - person AlexKorovyansky; 16.02.2011

Вы открываете базу данных в режиме чтения, поэтому это исключение.

попробуйте открыть базу данных в режиме записи следующим образом:

SQLiteDatabase db = mOpenHelper.getWritableDatabase();

person Vikas Patidar    schedule 16.02.2011

Убедитесь в этом:

SQLiteDatabase db = mOpenHelper.getWritableDatabase();

НЕ находится в вашем основном потоке

person Li3ro    schedule 26.03.2012