使用嵌入式关系型SQLite数据库存储数据
除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据。 SQLite可以解析大部分标准SQL语句,如: 一、使用SQLiteOpenHelper对数据库进行版本管理 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在成百上千个用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为我们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版本进行管理来实现前面提出的需求。 为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如果你愿意,设置为100也行),并且在onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后作出相应的表结构及数据更新。 getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。 public class DatabaseHelper extends SQLiteOpenHelper { 代码示例: 1、写一个DBSQLLiteOpenHelper继承SQLiteOpenHelper package com.example.lession05_db.db; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class DBSQLLiteOpenHelper extends SQLiteOpenHelper { private static final String name="CSDN.db"; private static final int version=3; public DBSQLLiteOpenHelper(Context context) { super(context,version); Log.v("DBSQLLiteOpenHelper","构造器--------"); } @Override public void onCreate(SQLiteDatabase db) { //execSQL来执行sql语句 db.execSQL("create table person(personid integer primary key autoincrement,age integer)"); Log.v("DBSQLLiteOpenHelper","创建执行一次"); } @Override public void onUpgrade(SQLiteDatabase db,int newVersion) { db.execSQL("alter table person add account integer"); Log.v("DBSQLLiteOpenHelper","当数据库版本更新的时候执行-----每次更新都执行一次"); } }
2、根据创建的表写一个实体bean package com.example.lession05_db.domain; public class Person { private Integer id; private String name; private Integer age; private Integer account; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Integer getAccount() { return account; } public void setAccount(Integer account) { this.account = account; } @Override public String toString() { return "Person [id=" + id + ",name=" + name + ",age=" + age + ",account=" + account + "]"; } public Person(Integer id,String name,Integer age,Integer account) { super(); this.id = id; this.name = name; this.age = age; this.account = account; } public Person() { super(); } }
package com.example.lession05_db.dao; import java.util.List; import android.database.sqlite.SQLiteDatabase; import com.example.lession05_db.domain.Person; public interface PersonDao { //增加的操作 public void insert(SQLiteDatabase db,Person entity); //修改的操作 public void update(SQLiteDatabase db,Person entity); //删除的操作 public void delete(SQLiteDatabase db,Integer id); //查询所有 public List<Person> findAll(SQLiteDatabase db); //分页查询 public List<Person> getNowPageInfo(SQLiteDatabase db,int nowpage,int pagesize); //按条件查询 public Person findById(SQLiteDatabase db,Integer id); } 4、写一个实现类实现那个接口 package com.example.lession05_db.dao; import java.util.ArrayList; import java.util.List; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.example.lession05_db.domain.Person; public class PersonDaoImpl implements PersonDao { @Override public void insert(SQLiteDatabase db,Person entity) { if (db.isOpen()) { db.execSQL( "insert into person(name,age,account) values(?,?,?)",new Object[] { entity.getName(),entity.getAge(),entity.getAccount() }); db.close(); } } @Override public void update(SQLiteDatabase db,Person entity) { if (db.isOpen()) { db.execSQL( "update person set name=?,age=?,account=? where personid=?",entity.getAccount(),entity.getId() }); db.close(); } } @Override public void delete(SQLiteDatabase db,Integer id) { if (db.isOpen()) { db.execSQL("delete from person where personid=?",new Object[]{id}); db.close(); } } @Override public List<Person> findAll(SQLiteDatabase db) { List<Person> persons=new ArrayList<Person>(); if(db.isOpen()){ Cursor cursor=db.rawQuery("select personid,account from person",null); while(cursor.moveToNext()){ Person person=new Person(); person.setId(cursor.getInt(0)); person.setName(cursor.getString(1)); person.setAge(cursor.getInt(2)); person.setAccount(cursor.getInt(3)); persons.add(person); } } return persons; } @Override public List<Person> getNowPageInfo(SQLiteDatabase db,int pagesize) { int start=(nowpage-1)*pagesize; List<Person> persons=new ArrayList<Person>(); if(db.isOpen()){ Cursor cursor=db.rawQuery("select personid,account from person limit ?,?",new String[]{start+"",pagesize+""} ); while(cursor.moveToNext()){ Person person=new Person(); person.setId(cursor.getInt(0)); person.setName(cursor.getString(1)); person.setAge(cursor.getInt(2)); person.setAccount(cursor.getInt(3)); persons.add(person); } } return persons; } @Override public Person findById(SQLiteDatabase db,Integer id) { Person person=null; if(db.isOpen()){ Cursor cursor=db.rawQuery("select personid,account from person where personid=?",new String[]{id+""}); while(cursor.moveToNext()){ person=new Person(); person.setId(cursor.getInt(0)); person.setName(cursor.getString(1)); person.setAge(cursor.getInt(2)); person.setAccount(cursor.getInt(3)); } } return person; } }
首先在项目清单中添加User Library <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.lession05_db" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.example.lession05_db"></instrumentation> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.lession05_db.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <uses-library android:name="android.test.runner"/> </application> </manifest>
package com.example.lession05_db.test; import java.util.List; import com.example.lession05_db.dao.PersonDao; import com.example.lession05_db.dao.PersonDaoImpl; import com.example.lession05_db.db.DBSQLLiteOpenHelper; import com.example.lession05_db.domain.Person; import android.database.sqlite.SQLiteDatabase; import android.test.AndroidTestCase; public class DBTest extends AndroidTestCase{ PersonDao personDao=new PersonDaoImpl(); public void createDB(){ DBSQLLiteOpenHelper db=new DBSQLLiteOpenHelper(this.getContext()); SQLiteDatabase sdb=db.getWritableDatabase(); } public void insert(){ DBSQLLiteOpenHelper db=new DBSQLLiteOpenHelper(this.getContext()); for(int i=1;i<10;i++){ SQLiteDatabase sdb=db.getWritableDatabase(); Person entity=new Person(null,"chenhj"+i,29,10000+i); personDao.insert(sdb,entity); } } public void update(){ DBSQLLiteOpenHelper db=new DBSQLLiteOpenHelper(this.getContext()); SQLiteDatabase sdb=db.getWritableDatabase(); Person entity=new Person(1,"shuangshuang",22,100009); personDao.update(sdb,entity); } public void delete(){ DBSQLLiteOpenHelper db=new DBSQLLiteOpenHelper(this.getContext()); SQLiteDatabase sdb=db.getWritableDatabase(); personDao.delete(sdb,1); } public void findAll(){ DBSQLLiteOpenHelper db=new DBSQLLiteOpenHelper(this.getContext()); SQLiteDatabase sdb=db.getWritableDatabase(); List<Person> persons=personDao.findAll(sdb); for(Person p:persons){ System.out.println(p.toString()); } } public void findById(){ DBSQLLiteOpenHelper db=new DBSQLLiteOpenHelper(this.getContext()); SQLiteDatabase sdb=db.getReadableDatabase(); Person p=personDao.findById(sdb,2); System.out.println(p.toString()); } public void page(){ DBSQLLiteOpenHelper db=new DBSQLLiteOpenHelper(this.getContext()); SQLiteDatabase sdb=db.getReadableDatabase(); List<Person> persons=personDao.getNowPageInfo(sdb,1,3); for(Person p:persons){ System.out.println(p.toString()); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |