上一讲我们讲解了 Android 中SD卡的存储方式[数据存储之File文件存储 [即SD卡的写入与读取]],共享参数的存储方式[SharedPreference 共享参数],这一讲我们来讲解一下数据库的存储方式 ,sqlite数据库属于文本型的数据库,它是以文本的形式来保存的。
1. sqlite 数据库介绍
查看 Android API文档中sqlite的介绍
Android提供了对 sqlite 数据库的完全支持,应用程序中的任何类都可以通过名称来访问任何的数据库,但是应用程序之外的就不能访问。 建议创建一个新的数据库的方式就是创建一个子类继承 sqliteOpenHelper 然后重写它的 onCreate() 方法,这样你就可以在数据库中执行 sqlite的语法命令来创建表了
查看API文档中sqliteOpenHelper类的介绍
这是一个帮助类,作用是管理数据库的创建和版本的管理,你可以创建一个子类来实现 onCreate(sqliteDatabase),onUpgrade(sqliteDatabase,int,int) 方法, onOpen(sqliteDatabase)可以选择是否要实现。这个类负责在数据库存在的情况下,打开数据库,如果它不存在则会创建数据库,并且在必要的时候更新它。事务也会被使用到,这样才能确保数据库总是在合理的状态。
查看它的方法列表:
getReadableDatabase() 可以通过这个方法进行数据库的创建和打开
2. 程序实现
1) DBOpenHelper.java 用来更新或者创建数据库使用
2) MainActivity.java 主程序的实现
- packagecom.android.sqlitedemo.db;
- importandroid.content.Context;
- importandroid.database.DatabaseErrorHandler;
- importandroid.database.sqlite.sqliteDatabase;
- importandroid.database.sqlite.sqliteOpenHelper;
- importandroid.database.sqlite.sqliteDatabase.CursorFactory;
- publicclassDBOpenHelperextendssqliteOpenHelper{
- /**
- *查看sqliteOpenHelperapi文档的,它的构造方法
- *publicsqliteOpenHelper(Contextcontext,Stringname,sqliteDatabase.CursorFactoryfactory,intversion)
- *创建一个帮助类的对象来创建,打开,或者管理一个数据库,这个方法总是会快速的返回,
- *这个数据库实际上是没有被创建或者打开的,直到getWritableDatabase()或者getReadableDatabase()方法中的一个被调用时才会进行创建或者打开
- *参数:
- *context:上下文对象,用来打开或者创建数据库
- *name:数据库文件的名称,如果是创建内存中则位null,
- *factory:用来创建游标对象,默认的是为null
- *version:数据库的版本号(以版本数字号1开始),如果数据库比较旧,就会用onUpgrade(sqliteDatabase,int)方法来更新数据库,
- *如果数据库比较新,就使用onDowngrade(sqliteDatabase,int)方法来回退数据库
- *【注意】:我们声明完这个构造方法之后,包括初始化它的名称和版本之后,实际上它还是没有马上被创建起来的。
- */
- privatestaticStringname="mydb.db";//表示数据库的名称
- //privatestaticintversion=1;//表示数据库的版本号
- staticintversion=2;//更新数据库的版本号,此时会执行onUpgrade()方法
- publicDBOpenHelper(Contextcontext){
- super(context,name,null,version);
- //TODOAuto-generatedconstructorstub
- }
- //当数据库创建的时候,是第一次被执行,完成对数据库的表的创建
- @Override
- voidonCreate(sqliteDatabasedb){
- //TODOAuto-generatedmethodstub
- //sqlite数据创建支持的数据类型:整型数据,字符串类型,日期类型,二进制的数据类型
- //数据库这边有一个特点,就是sqlite数据库中文本类型没有过多的约束,也就是可以把布尔类型的数据存储到文本类型中,这样也是可以的
- Stringsql="createtableperson(idintegerprimarykeyautoincrement,namevarchar(64),addressvarchar(64))";
- db.execsql(sql);//完成数据库的创建
- /**
- *onUpgrade()方法是在什么时候被执行呢?
- *查看API文档中onUpgrade()介绍
- *当数据库需要升级时调用这个方法[在开发过程中涉及到数据库的设计存在缺陷的时候进行升级,不会损坏原来的数据],这种实现方式会使用方法来减少表,或者增加表,或者做版本更新的需求。
- *在这里就可以执行sqliteAlter语句了,你可以使用ALTERTABLE来增加新的列插入到一张表中,你可以使用ALTERTABLE语句来重命名列或者移除列,或者重命名旧的表。
- *你也可以创建新的表然后将旧表的内容填充到新表中。
- *此方法会将事务之内的事件一起执行,如果有异常抛出,任何改变都会自动回滚操作。
- *参数:
- *db:数据库
- *oldVersion:旧版本数据库
- *newVersion:新版本数据库
- *【注意】:这里的删除等操作必须要保证新的版本必须要比旧版本的版本号要大才行。[即Version2.0>Version1.0]所以这边我们不需要对其进行操作。
- */
- voidonUpgrade(sqliteDatabasedb,153); font-weight:bold; background-color:inherit">intoldVersion,153); font-weight:bold; background-color:inherit">intnewVersion){
- Stringsql="altertablepersonaddsexvarchar(8)";
- db.execsql(sql);
- }
copy
- packagecom.android.sqlitedemo;
- importcom.android.sqlitedemo.db.DBOpenHelper;
- importandroid.os.Bundle;
- importandroid.app.Activity;
- importandroid.view.Menu;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- classMainActivityextendsActivity{
- privateButtonbutton;
- protectedvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- initComponent();
- button.setOnClickListener(newOnClickListener(){
- @Override
- voidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- DBOpenHelperhelper=newDBOpenHelper(MainActivity.this);
- //调用getWritableDatabase()或者getReadableDatabase()其中一个方法将数据库建立
- helper.getWritableDatabase();
- });
- booleanonCreateOptionsMenu(Menumenu){
- //Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
- getMenuInflater().inflate(R.menu.main,menu);
- returntrue;
- }
- voidinitComponent(){
- button=(Button)findViewById(R.id.button1);
- }