3

我创建了两个类,扩展 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 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 类的代码,嵌套在数据库类中:

 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

          }

         }
4

3 回答 3

4

是的,每次实例化一个数据库类时,都会实例化一个 SQLiteHelper。但是只有在数据库不存在时才会调用 SQLiteHelper onCreate。您可以通过向其中一个表中添加一个新列来测试这一点,然后尝试在该列中插入一个具有值的行,然后您的应用程序将崩溃。错误将是“没有这样的列”。然后,您需要清除数据或更改数据库版本或卸载应用程序以重新创建更改表。

于 2013-04-12T05:08:58.783 回答
2

每当您只想打开数据库时,都需要使用以下命令:

myDatabase = myOpenHelper.getWritableDatabase();

这不会创建一个新的数据库。它只会返回您可以在其上执行读/写操作的现有数据库的实例。

请参阅内容以深入了解在 Sqlite 中创建数据库的工作原理。希望能帮助到你。

于 2013-04-12T04:55:36.800 回答
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" + ");";

在创建表时使用此查询。如果表不存在,它将创建表。

于 2013-04-12T04:49:54.417 回答