簡體   English   中英

在Android 2.X和3.X上使用SQLiteOpenHelper的問題

[英]Issue with SQLiteOpenHelper on android 2.X and 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)

任何幫助都非常感謝!! 真的想快速解決,因為該應用程序已經在Play商店,我需要發布更新

不確定它是否是一種“最佳實踐”,但在我的應用程序中,我從不保持數據庫打開。 我在幾乎每個CRUD動作之前/之后打開和關閉它。 它適用於Android 2.2。

問題是我正在使用asyntasks從一個小部件進行這些數據庫操作。 雖然這在Android 4.0 +設備上運行得很好,但是對於較小版本的android,我必須首先創建一個活動,並在應用程序中創建所有數據庫並填充表,然后讓小部件檢索並顯示該數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM