【问题标题】:closing my database correctly正确关闭我的数据库
【发布时间】:2011-12-20 10:27:58
【问题描述】:

当我关闭它时,我无法创建我的数据库(检查下面的代码)。如果我不关闭它,一切正常,但我在 logcat 中收到几个错误,说 close() 从未被明确调用过。如果我创建了数据库,然后添加了close(),这些错误就会消失,但我无法重新安装我的应用程序并使用它运行它。

private static class DbHelper extends SQLiteOpenHelper {

    public DbHelper(Context context) {
        super(context, DATABASE_score, null, DATABASE_VERSION);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub

        db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID
                + " INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, " + KEY_SCORE1
                + " INTEGER TEXT NOT NULL, " + KEY_SCORE2
                + " INTEGER TEXT NOT NULL);");
        db.close(); <---problem
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
        onCreate(db);
    }
}

public Database(Context c) {
    ourContext = c;
}

public Database open() throws SQLException {
    ourHelper = new DbHelper(ourContext);
    ourDatabase = ourHelper.getWritableDatabase();
    return this;
}

public void close() {
    ourHelper.close();
}

public long createEntry(String score, String score2) {
    // TODO Auto-generated method stub
    ContentValues cv = new ContentValues();
    cv.put(KEY_SCORE1, score);
    cv.put(KEY_SCORE2, score2);

    return ourDatabase.insert(DATABASE_TABLE, null, cv);
}

所以问题是:我如何调用db.close() 并让我的应用程序正确运行?

【问题讨论】:

  • 发布 logcat 输出,至少前 10-15 行。

标签: android sqlite


【解决方案1】:

您不必在 DbHelper 类中的 onCreate() 中调用 db.close();

相反,您必须使用从 DbHelper 类获取数据库实例 DbHelper_instance.getReadableDatabase()DbHelper_instance.getWritableDatabase() 并将其分配给 SQLiteDatabase 对象(让我们将其定义为 SQLiteDatabase 数据库)。

使用完数据库并关闭光标后,您可以执行以下操作:

        if (database.isOpen()) {
            Log.d(TAG + " Closing SQLite Database connection...");
            database.close();
        }

您可以将其放在 finally 块中,以确保它始终执行(请注意您的数据库操作被包围在 try/catch 中)。

【讨论】:

  • 由于某种原因我无法实施您的解决方案;/
  • 我可以帮助你,如果你有直接的问题,或者发布你的完整来源。
  • 可悲的是,我做到了,但是一些非常聪明的人编辑了我的帖子!!!!我在您的帖子中看到了逻辑,并将尝试实现它....
【解决方案2】:
private Context context;
private SQLiteDatabase db;

public DataBase(Context context) {
    this.context = context;
    OpenHelper openHelper = new OpenHelper(this.context);
    this.db = openHelper.getWritableDatabase();
}

public void closeData() {
    this.db.close();
}

试试这个;)

【讨论】:

  • 嗯不能让它崩溃.... private Context context;私有 SQLiteDatabase 数据库;私有数据库 dbHelper;公共 DbHelper(上下文上下文){ 超级(上下文,DATABASE_score,null,DATABASE_VERSION); // TODO 自动生成的构造函数存根 this.context = context; this.db = dbHelper.getWritableDatabase(); } public void close() { dbHelper.close(); }
【解决方案3】:

调用 super.close();

 if(myDataBase != null)
        myDataBase.close();

       super.close();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 2015-04-21
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    相关资源
    最近更新 更多