我正在创建一个数据库应用程序,我的程序正常运行,而且我已经理解了我一直关注的大部分教程。但是,有一方面我不清楚。
MyDBHelper的内部类扩展了SQLiteOpenHelper。 外部变量包括名为d的SQLiteDatabase。 MyDBHelper的代码是:
private static class MyDBHelper extends SQLiteOpenHelper {
MyDBHelper(Context c) {
super(c, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(DATABASE_CREATE);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVers, int newVers) {
Log.w(TAG, "Upgrading database from version " + oldVers + " to " + newVers + ", which will destroy all old data.");
db.execSQL("DROP TABLE IF EXISTS GM");
onCreate(db);
}
}
我的问题是这是如何实际创建初始数据库的。它出现在onCreate()方法中,但据我所知,这是从不调用。我知道它是在第一次创建数据库时调用的,但在哪里?而且,它如何通过SQLiteDatabase数据库?我还没有将任何数据库传递给该方法。我的外部类的SQLiteDatabase db变量如何设置为创建的数据库?有人能像白痴一样跟我说话吗?
答案 0 :(得分:8)
onCreate()
和onUpgrade()
方法实际上是在创建Db时第一次调用的。
事实上,它已在getReadableDatabase() or getWritebleDatabase()
的{{1}}方法中进行了检查。它将检查数据库目录中是否已存在DB以及它的版本是什么。根据这个,它将调用SQLiteOpenHelper
。如果db文件存在且版本正确,则不执行任何操作。
您可以搜索代码以执行onCreate(), or onUpgrade()
。这是执行此项检查的时间。
如果需要更多详细信息,请与我们联系。祝你好运
答案 1 :(得分:3)
请记住,您正在扩展SQLiteOpenHelper,所有的魔法都发生在这个超级类中,特别是当您调用getReadableDatabase()
或getWritableDatabase()
时,最初创建(或只是重新打开)数据库。这两种方法:
SQLiteDatabase db
变量(并控制将db
传递给您的回调方法)db
方法或打开现有数据库onCreate(db)
onUpgrade(db)
或onDowngrade(db)
他们还会调用一些回调方法,例如onConfigure(db)
,onOpen(db)
等(Read more关于这些方法。)如果有帮助,可以通读{{3}你自己去了解所有这些发生的方式和时间的结构。
答案 2 :(得分:1)
onCreate()方法不是此类的构造函数。创建数据库时会调用onCreate。
这里PeopleDB扩展了SQLiteOpenHelper。此代码来自不同的类,当getWritableDatabase()或getReadableDatabase()或任何类型的名称被调用时,将调用onCreate
PeopleDB db = null; //onCreate NOT called here
db=new PeopleDB(getContext());
db.getWritableDatabase(); //onCreate is called here!
希望有所帮助。
答案 3 :(得分:1)
请参阅我们的数据库是在openhelper的构造函数本身中创建的,而不是在重写的onCreate方法中创建的。在onCreate方法中,我们触发了一个查询,用于在数据库中创建一个表,该表在open helper的构造函数中创建,用于插入不创建数据库的数据。
另一件事是SQLiteDatabase对象未在SQLiteOpenHelper类中实例化。它在您希望使用数据库执行数据库操作的类中实例化,您需要编写这样的函数来初始化或打开数据库以准备插入。
SQLiteDatabase database;
YourOpenHelper yourOpenHelper=new YourOpenHelper(); //to creating database using openhelper and automatically call onCreate to make a table in that
public void open() throws SQLException {
database = profiloHelper.getWritableDatabase();
}
以下是您必须为数据库中的任何操作编写的代码,例如插入删除任何内容,您只需要更改QUERY
SQLiteStatement insert_stmt = null;
try {
insert_stmt = database.compileStatement(YOUR_QUERY);
insert_stmt.bindString(1, field1);
insert_stmt.bindString(2, field2);
insert_stmt.executeInsert();
}
finally {
if (insert_stmt != null) insert_stmt.close();
}
答案 4 :(得分:0)
可能是getReadableDatabase()
或getWriteableDatabase()
第一次被召唤时
答案 5 :(得分:0)
您创建了一个实现onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)和可选的onOpen(SQLiteDatabase)的子类,该类负责打开数据库(如果存在),创建数据库(如果不存在),以及升级如有必要。 (Android开发者网站)
答案 6 :(得分:0)
班级SQLiteOpenHelper
有充分理由称为“助手”。它为我们的应用编写者节省了相当大的精力。
您致电getWritableDatabase
(或getReadableDatabase
)的第一次,用于实施SQLiteOpenHelper
,您的super
语句在构造函数中传递您更喜欢Context
的超类构造函数的当前NAME
和数据库SQLiteOpenHelper
。
然后,超类构造函数为SQLiteDatabase
设置初始空间,并为其指定通过super
的名称。
完成后,超类构造函数调用onCreate
并传递它通过SQLiteDatabase
唯一参数创建的命名onCreate
。由于onCreate
只被调用一次,因此它是调用execSQL
来定义数据库结构的好地方。
getReadableDatabase
(或getWritableDatabase
)的后续执行只会为您打开数据库,而不会再次调用onCreate
。 (当超类构造函数指出super
已发送不同的版本号时,onUpgrade
为calle。)
理解SQLiteOpenHelper
创建没有明显代码的数据库的方式以及heck onCreate
如何通过“突然出现”的参数传递给我一个真正的苦差事。现在我无法相信它可能一直很难。