Issue with SQLiteOpenHelper on android 2.X and 3.X

放肆的年华 提交于 2019-12-10 16:31:57

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!