问题
So i made a big mistake of testing my code on android 4.0 + and thinking it would work fine on other versions. But i am facing issues with 2.X and 3.X with SQLiteOpenHelper.
First the code :
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
Creating the DB by calling
MatchesDB newdb = new MatchesDB(context);
newdb.fillinfotable();
All this is working perfectly on all 4.0 + devices. However i'm getting the following error when trying to run on 2.x devices
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)
Any help is Highly appreciated !! really want a quick fix as the app is already on the play store and i need to publish an update
回答1:
Not sure if it's a kind of the "best practice" but in my app I never keep the db open. I open and close it before/after almost each CRUD action. It works on Android 2.2.
回答2:
The issue was that i was doing these database operations from a widget using asyntasks. While this works perfectly on android 4.0 + devices, however for lesser versions of android i had to first create an activity and do all the database creation and filling up of tables in the application and then have the widget retrieve and display that data.
来源:https://stackoverflow.com/questions/17641717/issue-with-sqliteopenhelper-on-android-2-x-and-3-x