【问题标题】:Issue with SQLiteOpenHelper on android 2.X and 3.Xandroid 2.X 和 3.X 上的 SQLiteOpenHelper 问题
【发布时间】:2013-07-14 17:17:36
【问题描述】:

所以我在 android 4.0 + 上测试我的代码并认为它​​可以在其他版本上正常工作时犯了一个大错误。但是我在使用 SQLiteOpenHelper 时遇到了 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)

非常感谢任何帮助!真的想要快速修复,因为该应用已经在 Play 商店中,我需要发布更新

【问题讨论】:

  • 不确定错误本身,但请理解dbwdbr 将指向同一个SQLiteDatabase 对象,因此您不需要两者。调用getWritableDatabase() 只会解锁一个已经打开的可读数据库(如果有的话)。
  • 好的,但即使我删除了 dbr,我仍然会遇到错误,这在 android 4.0 + 上没有发生,请帮助!
  • 似乎您遇到了与此处提到的相同的问题:[stackoverflow.com/a/9503044/1432239][1] [1]:stackoverflow.com/a/9503044/1432239
  • @user1492955 检查this 链接。

标签: android sqlite android-sqlite sqliteopenhelper


【解决方案1】:

不确定这是否是一种“最佳实践”,但在我的应用程序中,我从不保持数据库打开。我几乎在每个 CRUD 操作之前/之后打开和关闭它。它适用于 Android 2.2。

【讨论】:

    【解决方案2】:

    问题是我正在使用 asyntasks 从一个小部件执行这些数据库操作。虽然这在 android 4.0 + 设备上完美运行,但是对于较低版本的 android,我必须首先创建一个活动并在应用程序中创建所有数据库并填充表,然后让小部件检索并显示该数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-01
      • 2018-03-03
      相关资源
      最近更新 更多