为什么使用SQLiteOpenHelper而不是SQLiteDatabase?

在我的活动中,我有例如

SQLiteDatabase db = openOrCreateDatabase(Preferences.DB_NAME, Context.MODE_PRIVATE, null); db.execSQL("CREATE TABLE IF NOT EXISTS data (id INTEGER PRIMARY KEY, value VARCHAR)"); Cursor dbResult = db.rawQuery("SELECT value FROM data", null); // do sometning with cursors dbResult.close(); db.close(); 

使用SQLiteOpenHelper的好处是什么?

 DatabaseHelper helper = new DatabaseHelper(this); SQLiteDatabase db = helper.getWriteableDatabase(); SQLiteDatabase db_2 = helper.getReadableDatabase(); Cursor dbResult = db_2.rawQuery("SELECT value FROM data", null); // do sometning with cursors dbResult.close(); helper.close(); 

类本身

 public class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context) { super(context, Preferences.DB_NAME, null, Preferences.DB_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String query = "CREATE TABLE IF NOT EXISTS data (id INTEGER PRIMARY KEY, value VARCHAR)"; db.execSQL(query); db.close(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } 

Solutions Collecting From Web of "为什么使用SQLiteOpenHelper而不是SQLiteDatabase?"

SQLiteDatabase

SQLiteDatabase具有创build,删除,执行SQL命令以及执行其他常见数据库pipe理任务的方法。

SQLiteOpenHelper

pipe理数据库创build和版本pipe理的助手类。

我会这么说,SQLiteOpenHelper自带的onUpgrade在升级你的应用程序时真的很方便。 主要用于创build和升级/版本pipe理。 SQLiteDatabase主要用于CRUD操作(你可以用它创build,但这是SQLiteOpenHelper的用途)。

SQLiteOpenHelper提供了实用程序来简化创build和初始化数据库的任务(如果数据库尚未创build,并在应用程序升级和数据库模式更改时转换数据库的内容)。

如果你有一个非常简单的数据库模式,那么它并没有给你带来太多的好处,但是对于任何复杂的事情来说,这都是一个明确的帮助。 它确保覆盖所有的边缘条件,以便您不必将交易放在所有正确的位置,以避免数据库损坏。

上面的其他答案, SQLiteOpenHelper类中的一个非常重要的特性,它有2个同步的方法, getWritableDatabase()getReadableDatabase()

这意味着您的数据库操作是线程安全的 。

来自SQLiteOpenHelper类的代码片段

 public SQLiteDatabase getReadableDatabase() { synchronized (this) { return getDatabaseLocked(false); } } 

 public SQLiteDatabase getWritableDatabase() { synchronized (this) { return getDatabaseLocked(true); } } 

因为它是在官方开发人员参考中编写的

pipe理数据库创build和版本pipe理的助手类。

你创build一个实现onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)和onOpen(SQLiteDatabase)的子类,并且这个类负责打开数据库(如果存在的话),创build它,如果没有的话, 。 事务用于确保数据库始终处于合理的状态。

通过这个类,ContentProvider实现可以轻松地将数据库的打开和升级推迟到首次使用时,以避免阻止长时间运行数据库升级的应用程序启动。

有关示例,请参阅NotePad示例应用程序中的NotePadProvider类,位于SDK的samples /目录中。

所以SQLiteOpenHelper使事情变得更容易。

您可以使用此链接学习如何使用SQLiteOpenHelper处理SQLite。 SQLiteOpenHelper教程