android数据存储之数据库
2015-10-27 19:28
330 查看
Android 中数据存储分三类,一类是SQLiteDataBase类来实列化得到的小型数据库类型储存数据。二类是通过SharedPreferences类来保存。三类是通过File文件的形式来保存。这里简单介绍第一种保存数据类型,通过数据库来保存信息。数据库更目录在File Explorer---->data----->data---->database目录下。
创建android数据库的方法有两种
一、
通过Context对象调用openOrCreateDatabase(name, mode, factory) 方法。参数name为数据库名,mode为要创建数据库的访问类型,可以为私有和公有。factory设置为null。
由于是写的一个单元测试,所以创建数据库代码如下:
这种方式创建数据库创建简单,但是一旦创建就无法改变,这就造成了应用后期升级的不便。所有就有了下面一种创建方式。
二、
另一种方式是通过SQLiteOpenHelper 这个帮助类来创建数据库。我的代码如下:
继承这个类后有三个方法需要实现,第一个就是构造方法,
接下来就是public void onCreate(SQLiteDatabase db)方法,这个方法只是在实列化时执行一次。而第三个方法则跟版本号有关。当版本号改变时将执行该方法里面的代码。
测试代码如下:
android也为我们封装了一个类ContentValues来操作数据库。可以根据实际情况选用,这里直接上出入语句的代码。
对于查询语句,和Mysql查询语句一样,查询的结果为一个Cursor集合。相当于Mysql中的数据集。需要遍历将每一条记录取出来。
Cursor curser = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy).这个方法返回一个Cursor对象,这里就不分析各参数代表的意思了。下面会附上所有测试代码。遍历采用curser.moveToNext()来将游标移动到下一条数据。
以下是测试用到的两个类:
单元测试代码:
创建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); } } }
}
相关文章推荐
- Android下使用Properties文件保存程序设置
- Android onTouch事件传递机制
- android soap webservers 无法执行 报错 ht.call(SOAP_ACTION, envelope);解决方法
- Activity进阶知识整理
- Android自定义ListView
- android 实现button单击双击事件同时监控
- android文件存储
- Android控件之CheckBox多选框
- Android进阶之路——AIDL
- android里面隐藏控件的方法
- Android引入高速缓存的异步加载全分辨率
- Android 基础控件 TextView
- Android adb.exe程序启动不起来,如何处理
- android listview 嵌套ListView,子lv高度的问题
- Android WiFi移植
- 【Android 基础】Animation 动画介绍和实现
- Android自定义可循环的滚动选择器CycleWheelView 替代TimePicker/NumberPicker/WheelView
- Android Activity界面跳转讲解
- 自定义可移动view
- Android开发中的多线程