Android 中数据存储分三类,一类是SQLiteDataBase类来实列化得到的小型数据库类型储存数据。二类是通过SharedPreferences类来保存。三类是通过File文件的形式来保存。这里简单介绍第一种保存数据类型,通过数据库来保存信息。数据库更目录在File Explorer---->data----->data---->database目录下。
创建android数据库的方法有两种
一、
通过Context对象调用openOrCreateDatabase(name, mode, factory) 方法。参数name为数据库名,mode为要创建数据库的访问类型,可以为私有和公有。factory设置为null。
由于是写的一个单元测试,所以创建数据库代码如下:
SQLiteDatabase db = getContext().openOrCreateDatabase("call.db", getContext().MODE_PRIVATE, null); //创建数据库 db.execSQL("create table teacher (id int,name varchar(50))"); //向该数据库中添加表 db.execSQL("insert into teacher values(1,'小红')"); //向表中插入记录这样就创建了数据库了。而且执行了SQL语句创建相应表,插入了一条记录。
这种方式创建数据库创建简单,但是一旦创建就无法改变,这就造成了应用后期升级的不便。所有就有了下面一种创建方式。
二、
另一种方式是通过SQLiteOpenHelper 这个帮助类来创建数据库。我的代码如下:
public class MySQLiteDBHelper extends SQLiteOpenHelper { private static final String DB_NAME = "database.db";//数据库名字 private static final int DB_VERSION = 1; //数据库版本号 /* * 初始化操作 Context context , String name(数据库名字),CursorFactory factory, int version(版本号方便修改数据库) */ public MySQLiteDBHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); // 对要建的数据库进行初始化 } @Override /** * 初始化创建数据库 */ public void onCreate(SQLiteDatabase db) { //创建数据库要执行的代码 。。只执行一次 Log.v("db", "onCreate-----------------"); String sql = "create table user (id int,username varchar(20),password varchar(50))"; db.execSQL(sql); //执行创建表的SQL语句 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 升级数据库时执行 } }
public MySQLiteDBHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub }可以看出有几个参数需要设置,name参数为数据库名,factory设为null, 整型的Version为版本号。这个参数相当有作用。它决定了后面两个方法是否会执行。
接下来就是public void onCreate(SQLiteDatabase db)方法,这个方法只是在实列化时执行一次。而第三个方法则跟版本号有关。当版本号改变时将执行该方法里面的代码。
测试代码如下:
public void testDBHelper(){ //通过系统的SQLiteOpenHelper 来创建数据库 MySQLiteDBHelper dbHelper = new MySQLiteDBHelper(getContext()); //得到helper对象 SQLiteDatabase db = dbHelper.getReadableDatabase(); // 通过helper对象得到数据库 }这样就得到了SQLiteDatabase的实列了。就可以执行SQL语句了。若是觉得每次写Sql语句麻烦
android也为我们封装了一个类ContentValues来操作数据库。可以根据实际情况选用,这里直接上出入语句的代码。
ContentValues values = new ContentValues(); // andorid 系统定义的类用来拆解SQL语句 values.put("id", 2); values.put("username", "张三"); values.put("password", "10010"); db.insert("user", null, values); // 执行插入语句 ,参数分别为表名、null、插入内容 String sql = "insert into user values(1,'李四','10011')"; db.execSQL(sql); // 用原始SQL语句进行插入对应的更新语句为db.update()。删除语句为db.delete()在使用时注意参数表达的意思。
对于查询语句,和Mysql查询语句一样,查询的结果为一个Cursor集合。相当于Mysql中的数据集。需要遍历将每一条记录取出来。
Cursor curser = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy).这个方法返回一个Cursor对象,这里就不分析各参数代表的意思了。下面会附上所有测试代码。遍历采用curser.moveToNext()来将游标移动到下一条数据。
public void findUser(){ // 查找 返回的是一个集合。。需要遍历,跟原SQL返回的结果集类似 String[] columns = new String[]{"id","username","password"}; // 查找后需要返回的字段 String selection = new String("id = ?"); //查找的条件字段 String[] selectionArgs = new String[]{"1"};//查找条件的值 Cursor curser = db.query("user", columns, selection, selectionArgs, null, null, "id asc"); if(curser.getCount() > 0){ // 取出来的结果有元素时才执行下面的代码 Log.v("db", "id----" +"name"+"------password"); while(curser.moveToNext()){ int id = curser.getInt(curser.getColumnIndex("id")); String name = curser.getString(curser.getColumnIndex("username")); String password = curser.getString(curser.getColumnIndex("password")); Log.v("db", id +" " +name + " "+password); } } }
public class MySQLiteDBHelper extends SQLiteOpenHelper { private static final String DB_NAME = "database.db";//数据库名字 private static final int DB_VERSION = 1; //数据库版本号 /* * 初始化操作 Context context , String name(数据库名字),CursorFactory factory, int version(版本号方便修改数据库) */ public MySQLiteDBHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); // 对要建的数据库进行初始化 } @Override /** * 初始化创建数据库 */ public void onCreate(SQLiteDatabase db) { //创建数据库要执行的代码 。。只执行一次 Log.v("db", "onCreate-----------------"); String sql = "create table user (id int,username varchar(20),password varchar(50))"; //若要把Id设为自增 怎类型应该为INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT db.execSQL(sql); //执行创建表的SQL语句 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // } }
单元测试代码:
public class JUiteTestDB extends AndroidTestCase { private SQLiteDatabase db; @Override protected void setUp() throws Exception { // 测试的初始化操作,每次执行测试代码是将先执行这里面的代码 super.setUp(); MySQLiteDBHelper dbHelper = new MySQLiteDBHelper(getContext()); //得到helper对象 db = dbHelper.getReadableDatabase(); //两个方法都可以打开数据库,readable方法在空间充足时打开可写不报错,空间不足时打开不可写不报错 // db = dbHelper.getWritableDatabase(); //Writable方法在空间充足时打开可写不报错,不足时直接报错 } public void testDataBase(){ SQLiteDatabase db = getContext().openOrCreateDatabase("call.db", getContext().MODE_PRIVATE, null); //创建数据库 db.execSQL("create table teacher (id int,name varchar(50))"); //向该数据库中添加表 db.execSQL("insert into teacher values(1,'小红')"); //向表中插入记录 } public void testDBHelper(){ //通过系统的SQLiteOpenHelper 来创建数据库 MySQLiteDBHelper dbHelper = new MySQLiteDBHelper(getContext()); //得到helper对象 SQLiteDatabase db = dbHelper.getReadableDatabase(); // 通过helper对象得到数据库 } // 增 public void testAddUser(){ // 插入语句 操作的是mydatabase.db数据库 //每次测试都会执行setUp()方法里的代码。得到db数据库 ContentValues values = new ContentValues(); // andorid 系统定义的类用来拆解SQL语句 values.put("id", 2); values.put("username", "张三"); values.put("password", "10010"); db.insert("user", null, values); // 执行插入语句 ,参数分别为表名、null、插入内容 String sql = "insert into user values(1,'李四','10011')"; db.execSQL(sql); // 用原始SQL语句进行插入 } public void testDeleteUser(){//删 String whereClause = "id = ?"; // 条件字段 String[] whereArgs = new String[]{"2"}; //条件值 db.delete("user", whereClause, whereArgs); } public void testUpdataUser(){ // 改 ContentValues values = new ContentValues(); values.put("username", "王五"); // 要修改的字段以及修改的内容 String whereClause = "password = ?"; //标识字段 String[] whereArgs = new String[]{"10011"}; //标识字段的值 db.update("user", values, whereClause, whereArgs); //执行 } public void findUser(){ // 查找 返回的是一个集合。。需要遍历,跟原SQL返回的结果集类似 String[] columns = new String[]{"id","username","password"}; // 查找后需要返回的字段 String selection = new String("id = ?"); //查找的条件字段 String[] selectionArgs = new String[]{"1"};//查找条件的值 Cursor curser = db.query("user", columns, selection, selectionArgs, null, null, "id asc"); if(curser.getCount() > 0){ // 取出来的结果有元素时才执行下面的代码 Log.v("db", "id----" +"name"+"------password"); while(curser.moveToNext()){ int id = curser.getInt(curser.getColumnIndex("id")); String name = curser.getString(curser.getColumnIndex("username")); String password = curser.getString(curser.getColumnIndex("password")); Log.v("db", id +" " +name + " "+password); } } } }