Android为了让我们能够更加方便地管理数据库,专门提供了一个SQLiteOpenHelper帮助类,我们可以借助这个类对数据库进行创建和升级.SQLiteOpenHelper中有两个抽象方法,分别是onCreate()和onUpgrade(),我们需要在自己的帮助类里面重写这两个方法,分别在这两个方法中去实现创建,升级数据库的逻辑.
SQLiteOpenHelper有了两个非常重要的方法,getReadableDatabase()和getWritableDatabase().这两个方法都可以创建或者打开一个现有的数据库,(存在直接打开,不存在创建一个),并返回一个可对数据库进行读写操作的对象.
当数据库不可写入(如磁盘空间已满),getReadableDatabase(0方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则出现异常.
SQLiteOpenHelper中有两个构造方法可供重写,一般使用参数少一点的那个构造方法即可.这个构造方法中接受4个参数,第一个参数是Context,必须要有它才能对数据库进行操作.第二个参数是数据库名,创建数据时使用的就是这里指定的名称,第三个参数语序我们在查询数据的适合返回一个自定义的cursor,一般传入null,第四个参数表示当前数据库的版本号,可用于对数据库进行升级操作,构建SQLiteOpenHelper的实例之后,在调用它的getReaableDatabase()或getWritableDatabase()方法就能创建数据库了.数据库文件存放在/data/data/<package name>/database/目录下.此时,重写onCreate()方法就会得到执行,所以通常在这里去处理一些创建表的逻辑.
创建表时所需要用到的数据类型:integer(整型),real(浮点型),text(文本型),blob(二进制),
约束:primary key为主键,autoincrement关键字表示id列时自 增长的.
实际操作代码:
新建MyDatabaseHelper类继承自SQLiteOpenHelper,代码如下
public class MyDatabaseOpenHelper extends SQLOpenHelper{ public static final String CREAT_BOOK = "create table Book(" +"id integer primary key autoincrement," +"author text," +"price real," +"page inrteger," +"name text)"; private Context mContext; public MyDatabaseHelper(Context context,String name,SQLDatabse,CursorFactory factory,int version){ super(context,name,factory,version); mContext = context; } @Override public void onCreate(SQLiteDatabase db){ db.exec(CREATE_BOOK); } @Override public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){ } }
MainActivity.class中的代码
public class MainActivity extends APPCompatActivity{ private MyDatabaseHelper dbHelper; @Override protected void onCreate(Bundle saveInstanceState){ super.onCreate(saveInstanceState); setContenView(R.layout.activity_main); dbHelper=new MyDatabaseOpenHelper(this,"BookStore.db",null,1); Button createDatabase =(Button)findViewById(R.id.create_database); createbase.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v){ dbHelper.getWritableDatabase(); } }); } }
布局文件
.... <Button android:id="@+id/create_database" android:layout_width="match_parent" android:layout_height="wrap_parent" /> </LinearLayout>
到这里,第一个表的创建就完成了,但是如果我们想再创建一个表,应该怎么办呢?
用同样的方法在onCreate()里面添加代码,如果我们这样尝试过,会发现表是没有办法创建的,这是因为BookStorre.db数据库已经存在了,代码中的onCreate就不会执行,我们可以选择卸载软件,重新安装或者使用onUpgrade()方法进行升级,
public class MyDatabaseHelper extends SQLiteOpenHelper{ ... @Override public void onUpgrade(SQLiteDatabase db,int oldversion,int newVersion){ db.execSQL("drop table if exists Book"); db.execSQl("drop table if exists Category") ; onCreate(db); } }
在这里,我们执行了drop语句,如果数据中已经存在Book或者Categroy,就会先删除掉,在调用onCreate重新创建,
然后我们需要让onUpgrade()方法执行,只需要SQLiteOpenHelper的构造方法里接受的第四个参数,它表示当前的版本好,之前我传入的是1,现在只要传入一个比1大的数字,onUpgrade就会执行
修改MainActivity,class中的代码即可,
dbHelper =new MyDatabaseHelper(this,"BookStore.db,null,2");
以上便是SQLiteDatbaseOpneHelper()的创建表和升级表.