android 2.X和3.X上的SQLiteOpenHelper问题
所以我犯了一个大错误,在android 4.0+上测试我的代码,并认为它可以在其他版本上正常工作。但是,我在使用SQLiteOpenHelper时遇到了2.X和3.X的问题 首先是守则:android 2.X和3.X上的SQLiteOpenHelper问题,android,sqlite,android-sqlite,sqliteopenhelper,Android,Sqlite,Android Sqlite,Sqliteopenhelper,所以我犯了一个大错误,在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 DATABAS
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)
07-14 21:29:14.890:E/数据库(22231):创建表android_元数据失败
07-14 21:29:14.898:E/数据库(22231):创建表android_元数据失败
07-14 21:29:15.640:E/数据库(22231):构建时设置Locale()失败,关闭数据库
07-14 21:29:15.640:E/数据库(22231):android.Database.sqlite.SQLiteException:数据库已锁定
07-14 21:29:15.640:E/Database(22231):在android.Database.sqlite.SQLiteDatabase.native_setLocale(native方法)
07-14 21:29:15.640:E/Database(22231):位于android.Database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:2000)
07-14 21:29:15.640:E/Database(22231):位于android.Database.sqlite.SQLiteDatabase。(SQLiteDatabase.java:1857)
07-14 21:29:15.640:E/Database(22231):位于android.Database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:822)
07-14 21:29:15.640:E/Database(22231):在android.Database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:856)
07-14 21:29:15.640:E/Database(22231):位于android.Database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:849)
07-14 21:29:15.640:E/Database(22231):位于android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:556)
07-14 21:29:15.640:E/Database(22231):位于android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
07-14 21:29:15.640:E/Database(22231):位于android.Database.sqlite.SQLiteOpenHelper.getwriteabledatabase(SQLiteOpenHelper.java:118)
非常感谢您的帮助!!真的很想快速修复,因为应用程序已经在play store上,我需要发布一个更新不确定这是否是一种“最佳实践”,但在我的应用程序中,我从未保持db打开。我几乎在每次CRUD操作之前/之后打开和关闭它。它在安卓2.2上工作。问题是我使用asyntasks从一个小部件执行这些数据库操作。虽然这在android 4.0+设备上非常有效,但是对于android的较低版本,我必须首先创建一个活动,在应用程序中创建所有数据库并填充表格,然后让小部件检索并显示数据。不确定错误本身,但是请理解,
dbw
和dbr
将指向同一个SQLiteDatabase
对象,因此您不需要同时使用这两个对象。调用getWritableDatabase()
只需解锁一个已经打开的可读数据库(如果有)。好的,但即使我删除了dbr,我仍然会出现错误,这在android 4.0+上不会发生。请帮助!似乎您遇到了与此处所述相同的问题:[[1]:@user1492955检查链接。