2013-07-14 3 views
4

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

Первый код:

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) 

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

+1

Не уверен в самой ошибке, но, пожалуйста, поймите, что 'dbw' и' dbr' будут указывать на один и тот же объект '' SQLiteDatabase', и поэтому вам не нужны оба. Вызов 'getWritableDatabase()' просто разблокирует уже открытую читаемую базу данных (если она есть). – CommonsWare

+0

нормально, но даже если я удалю dbr, я все еще получаю ошибку и этого не происходит на Android 4.0 +, пожалуйста, помогите! – user1492955

+0

Похоже, вы испытываете такой же вопрос, как указано здесь: [http://stackoverflow.com/a/9503044/1432239][1] [1]: HTTP: // StackOverflow. com/a/9503044/1432239 – maclir

ответ

0

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

0

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