Проблема с SQLiteOpenHelper на Android 2.X и 3.X

Так что я сделал большую ошибку, протестировав свой код на Android 4.0+ и думая, что он будет нормально работать на других версиях. Но у меня возникают проблемы с 2.X и 3.X с SQLiteOpenHelper.

Сначала код:

 public class HelperDB extends SQLiteOpenHelper implements BaseColumns {

 public static final int DATABASE_VERSION = 2;
 public static final String DATABASE_NAME = "MYDB.db";
 public static final String TABLE_NAME = "MYtable";
 public static final String TABLE_NAME_LOGO = "MYLogos";
 public static final String COLUMN_NAME_1 = "xxxxx";
 public static final String COLUMN_NAME_2 = "yyyy";
 public static final String COLUMN_NAME_3 = "zzzz";
 public static final String COLUMN_NAME_4 = "aaaa";
 public static final String COLUMN_NAME_LOGO = "logo";
 public static final String COLUMN_NAME_5 = "3333";
 public static final String COLUMN_NAME_6 = "fffff";
 public static final String COLUMN_NAME_7= "Abc";

public HelperDB(Context context)
{
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
 public void onCreate(SQLiteDatabase db){

    db.execSQL("CREATE TABLE " + TABLE_NAME + "(" + _ID + " INTEGER PRIMARY KEY autoincrement," + COLUMN_NAME_1 + " TEXT not null," + COLUMN_NAME_2
            + " TEXT not null," + COLUMN_NAME_3 + " TEXT not null," + COLUMN_NAME_4 + " LONG not null," + COLUMN_NAME_5 + " INT DEFAULT 99," + COLUMN_NAME_6 +" INT DEFAULT 99);");


    db.execSQL("CREATE TABLE " + TABLE_NAME_LOGO + "(" + _ID + " INTEGER PRIMARY KEY autoincrement," + COLUMN_NAME_6 + " TEXT not null,"  +  COLUMN_NAME_7 + " INTERGET not null);");

}

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

}

 }
******************************************************************************

  public class MatchesDB {

private HelperDB dbHelper;  
private SQLiteDatabase dbw, dbr; 
public static int id;

public MatchesDB(Context context){  

    dbHelper = new HelperDB(context); 
    dbw = dbHelper.getWritableDatabase();
    dbr = dbHelper.getReadableDatabase();
}

public void fillinfotable(){}
And all other functions to query the database and delete etc

Создание БД вызовом

      MatchesDB newdb = new MatchesDB(context);
  newdb.fillinfotable();

Все это прекрасно работает на всех устройствах 4.0+. Однако я получаю следующую ошибку при попытке запустить на устройствах 2.x

07-14 21:29:14.890: E/Database(22231): CREATE TABLE android_metadata failed
07-14 21:29:14.898: E/Database(22231): CREATE TABLE android_metadata failed
07-14 21:29:15.640: E/Database(22231): Failed to setLocale() when constructing, closing      the database
07-14 21:29:15.640: E/Database(22231): android.database.sqlite.SQLiteException:  database is locked
07-14 21:29:15.640: E/Database(22231):  at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
07-14 21:29:15.640: E/Database(22231):  at   android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:2000)
07-14 21:29:15.640: E/Database(22231):  at android.database.sqlite.SQLiteDatabase. <init>(SQLiteDatabase.java:1857)
07-14 21:29:15.640: E/Database(22231):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:822)
07-14 21:29:15.640: E/Database(22231):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:856)
07-14 21:29:15.640: E/Database(22231):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:849)
07-14 21:29:15.640: E/Database(22231):  at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:556)
07-14 21:29:15.640: E/Database(22231):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
07-14 21:29:15.640: E/Database(22231):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)

Любая помощь высоко ценится !! очень нужно быстрое исправление, так как приложение уже есть в магазине игр, и мне нужно опубликовать обновление


person user1492955    schedule 14.07.2013    source источник
comment
Не уверен насчет самой ошибки, но, пожалуйста, поймите, что dbw и dbr будут указывать на один и тот же объект SQLiteDatabase, и поэтому вам не нужны оба. Вызов getWritableDatabase() просто разблокирует уже открытую доступную для чтения базу данных (если она есть).   -  person CommonsWare    schedule 14.07.2013
comment
хорошо, но даже если я удалю dbr, я все равно столкнусь с ошибкой, и этого не происходит на Android 4.0 +, пожалуйста, помогите!   -  person user1492955    schedule 14.07.2013
comment
Похоже, у вас та же проблема, что и здесь: [stackoverflow.com/a/9503044/1432239][1 ] [1]: stackoverflow.com/a/9503044/1432239   -  person maclir    schedule 14.07.2013
comment
@user1492955 проверьте эту ссылку.   -  person Vinay    schedule 15.07.2013


Ответы (2)


Не уверен, что это своего рода «лучшая практика», но в моем приложении я никогда не держу БД открытой. Я открываю и закрываю его до/после почти каждого действия CRUD. Работает на Андроиде 2.2.

person slkorolev    schedule 29.07.2013

Проблема заключалась в том, что я выполнял эти операции с базой данных из виджета, используя асинтаски. Хотя это отлично работает на устройствах Android 4.0 +, однако для младших версий Android мне пришлось сначала создать действие и выполнить все создание базы данных и заполнение таблиц в приложении, а затем получить виджет и отобразить эти данные.

person user1492955    schedule 22.10.2013