微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何只创建一次数据库,然后多次读取和写入SQLite,OpenHelper,Android

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

          }

         }

解决方法:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐