java - 尝试在初始化数据库时重新打开一个已经关闭的对象sqlitedatabase,android

标签 java android database sqlite

我知道有很多重复的问题,但我还没有找到答案。

这是我的代码: 我有 DatabaseHandler 类,其中有两个方法 createTestTable(db);initializeTestTable(db);

        public class DatabaseHandler extends SQLiteOpenHelper {

        // Database Version
        private static final int DATABASE_VERSION = 1;

        // Database Name
        private static final String DATABASE_NAME = "AttendanceManagement";

        private static DatabaseHandler sInstance;

        public static synchronized DatabaseHandler getInstance(Context context) {

            if (sInstance == null) {
                sInstance = new DatabaseHandler(context.getApplicationContext());
            }
            return sInstance;
        }

        private DatabaseHandler(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        // Creating Tables
        @Override
        public void onCreate(SQLiteDatabase db) {
            createTestTable(db);
            initializeTestTable(db);
        }

        private void createTestTable(SQLiteDatabase db) {
            String CREATE_TEST_TABLE = "CREATE TABLE IF NOT EXISTS test" + "("
                    + "name TEXT" + ")";

            db.execSQL(CREATE_TEST_TABLE);
        }

        private void initializeTestTable(SQLiteDatabase db) {

//      SQLiteDatabase db = this.getWritableDatabase();
//      when I execute above code line I get following error.
//      java.lang.IllegalStateException: getDatabase called recursively
            ContentValues values = new ContentValues();

            values.put("name", "test1");

            // Inserting Row
            db.insert("test", null, values);
            db.close();

        }

    }

在我的 Activity 中,我在 onCreate()

中有以下代码
db = DatabaseHandler.getInstance(this);
db.getWritableDatabase();

我的应用程序在第二行后崩溃 db.getWritableDatabase();

我正在关注崩溃日志

05-03 10:46:33.130: E/AndroidRuntime(5727): FATAL EXCEPTION: main
05-03 10:46:33.130: E/AndroidRuntime(5727): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.cms.attendance/com.cms.attendance.fingerprintreader.newui.DashboardActivity}: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.cms.attendance/databases/AttendanceManagement
05-03 10:46:33.130: E/AndroidRuntime(5727):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at android.os.Looper.loop(Looper.java:137)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at android.app.ActivityThread.main(ActivityThread.java:5041)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at java.lang.reflect.Method.invokeNative(Native Method)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at java.lang.reflect.Method.invoke(Method.java:511)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at dalvik.system.NativeStart.main(Native Method)
05-03 10:46:33.130: E/AndroidRuntime(5727): Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.cms.attendance/databases/AttendanceManagement
05-03 10:46:33.130: E/AndroidRuntime(5727):     at android.database.sqlite.SQLiteClosable.acquireReference(SQLiteClosable.java:55)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at android.database.sqlite.SQLiteDatabase.endTransaction(SQLiteDatabase.java:520)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:263)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at com.cms.attendance.fingerprintreader.newui.DashboardActivity.onCreate(DashboardActivity.java:96)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at android.app.Activity.performCreate(Activity.java:5104)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
05-03 10:46:33.130: E/AndroidRuntime(5727):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
05-03 10:46:33.130: E/AndroidRuntime(5727):     ... 11 more

请告诉我如何解决这个问题。

最佳答案

你可以尝试一下

 public void onCreate(SQLiteDatabase db) {
            createTestTable(db);
            initializeTestTable(getInstance(context));
        }

因为您需要重新初始化数据库,然后您可以关闭它。

关于java - 尝试在初始化数据库时重新打开一个已经关闭的对象sqlitedatabase,android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36996476/

相关文章:

android - 在android应用程序上写问题

python - 在 python mysql 中使用 Select 查询作为 if/else block 的参数

database - Datomic 元数据中是否有实体,例如创建和更新时间?

java - 设置 CLASSPATH 以正确运行 Duke

java - 在 Maven 中创建依赖组以供重用——包括 'provided' 依赖

java - 如何从 Fragment 类中的 URL 加载图像?

PHP - 从 MySQL 选择数据库不起作用

java - Spring 数据休息: Query parameters chained with logical OR

java - 当斐波那契数列 > 2 时,Iteral fibonacci java 代码返回 0

java - Android 应用索引集成