我创建了两个类,扩展Activity的主类和保存数据库及其方法的Database类。数据库类中的部分代码如下所示。
SQLiteOpenHelper类是数据库类中的嵌套类。我从互联网上找到的一个例子中得到了它。这个嵌套类的内部是方法,
db.execSQL(SCRIPT_CREATE_DATABASE);
如何创建新数据库?如果我从Main类实例化Database类,如下所示:
Database db = new Database(this);
该实例化是否也自动实例化嵌套的SQLiteOpenHelper类?所以我不必明确这样做。
然而,对于如何创建数据库的这个例子,我很困惑。如果每次我实例化一个调用addNewRow()方法的新实例,如下所示:
public void addNewRow(String label, int price){
Database db = new Database(context);
db.openToWrite();
db.insertNewRow(checkBoxStatus, label, price);
db.close();
}
然后在“新数据库(上下文)”调用上创建一个新数据库,然后我添加信息以进入列。最后调用db.close(),但每次调用上面显示的addNewRow方法时,它都会实例化一个新数据库,并且还会实例化SQLiteOpenhelper类,以便创建一个新的数据库。这意味着最后一个数据库已被覆盖,我添加的最后一行已丢失,这是正确的吗?
我如何使用这个Database类只创建一次数据库,然后通过多次调用来读取和写入数据?
Database db = new Database(context);
db.openToWrite(); or db.openToRead();
// read or update or create new row in database
db.close();
数据库类:
public class Database {
public static final String MYDATABASE_NAME = "my_database";
public static final String MYDATABASE_TABLE = "my_table";
public static final int MYDATABASE_VERSION = 1;
public static final String KEY_CHECKBOX_STATUS = "check_box_status";
public static final String KEY_CHECKBOX_LABEL = "check_box_label";
public static final String KEY_PRICE = "price";
//create table MY_DATABASE (ID integer primary key, Content text not null);
private static final String SCRIPT_CREATE_DATABASE =
"CREATE TABLE " + MYDATABASE_TABLE + " (" + "ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
"KEY_CHECKBOX_STATUS INTEGER, " + "KEY_CHECKBOX_LABEL TEXT, " + " KEY_PRICE INTEGER" + ");";
SQLiteDatabase sqLiteDatabase;
SQLiteHelper sqLiteHelper;
Context context;
public Database(Context c){
context = c;
}
// after this all the rest of the methods for get and set of database values
SQLiteOpenHelper类的代码,嵌套在Database Class:
中 public class SQLiteHelper extends SQLiteOpenHelper {
public SQLiteHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(SCRIPT_CREATE_DATABASE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
答案 0 :(得分:4)
是的,每次实例化Database类时,都会实例化SQLiteHelper。但只有在数据库不存在的情况下才会调用SQLiteHelper onCreate。您可以通过向其中一个表添加新列来测试此操作,然后尝试在此列中插入具有值的行,然后您的应用将崩溃。错误将是“没有这样的列”。然后,您需要清除数据或更改数据库版本或卸载应用程序以重新创建更改表。
答案 1 :(得分:2)
无论何时只想打开数据库,都需要使用:
myDatabase = myOpenHelper.getWritableDatabase();
这不会创建新数据库。它只会返回现有数据库的实例,您可以在其上执行读/写操作。
请参阅this以深入了解如何在Sqlite中创建数据库。希望它有所帮助。
答案 2 :(得分:1)
private static final String SCRIPT_CREATE_DATABASE =
"CREATE TABLE IF NOT EXISTS " + MYDATABASE_TABLE + " (" + "ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
"KEY_CHECKBOX_STATUS INTEGER, " + "KEY_CHECKBOX_LABEL TEXT, " + " KEY_PRICE INTEGER" + ");";
创建表时使用此查询。如果表不存在,它将创建表。