android数据存储三
来源:互联网 发布:单片机软件工程师要求 编辑:程序博客网 时间:2024/05/12 17:09
在andorid数据存储二中讲到了对SQLite数据库的增删查改也通过AndroidTestCase 进行了测试。在andorid数据存储三就来看看android自带对数据库操作增删查改的方法,利用这些方法可以更加方便的来操作表。同时也了解一下数据库的升级,有时候我们对软件的升级可能涉及到表的更改,有可能带来对表的操作。
SQLiteDatabase自带的对数据库增删查改的实例:
在android数据存储二的基础上添加了StudentDaoTwo .java实现了SQLiteDatabase自带方法的实现:
package com.cooguo.sqlite.dao;
import java.util.ArrayList;
import java.util.List;
import com.cooguo.sqlite.model.Student;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
/**
* android自带的增删查改的方法
* @author Lenovo
*
*/
public class StudentDaoTwo {
private DBOpenHelper helper;
private SQLiteDatabase db ;
public StudentDaoTwo(Context context){
helper = new DBOpenHelper(context);
}
/**
* 添加学生信息
* @param student
*/
public void add(Student student){
db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("sid",student.getSid());
values.put("name", student.getName());
values.put("age",student.getAge());
//nullColumnHack:当values参数为空或者里面没有内容的时候,进行insert操作是会失败,底层数据库不允许插入一个空行
//为了防止这种情况,我们要在这里指定一个列名,到时候如果将要发现插入的是空行时,就是将你指定的这个列名的值设为NULL
//然后再像数据库中插入
db.insert("t_student","sid", values);
}
/**
* 更新学生信息
* @param studnet
*/
public void update(Student student){
db = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name",student.getName());
values.put("age", student.getAge());
db.update("t_student", values, "sid = ?", new String[]{String.valueOf(student.getSid())});
}
/**
* 更加学生ID查询学生信息
* @param stuId
* @return
*/
public Student find(int stuId){
db = helper.getWritableDatabase();
Cursor cursor = db.query("t_student", new String[]{"sid","name","age"},"sid = ?" ,
new String[]{String.valueOf(stuId)},null, null, null);
if(cursor.moveToNext()){
return new Student(cursor.getInt(0),cursor.getString(1),cursor.getInt(2));
}
return null;
}
/**
* 根据ID删除相应的学生信息
* @param ids
*/
public void delete(Integer... ids){
if(ids.length>0){
StringBuffer sb = new StringBuffer();
String[] strids = new String[ids.length];
for(int i=0;i<ids.length;i++){
sb.append("?").append(",");
strids[i] = String.valueOf(ids[i]);
}
sb.deleteCharAt(sb.length()-1);
db = helper.getWritableDatabase();
db.delete("t_student","sid in ("+sb+")", strids);
}
}
/**
* 分页获取学生信息
* @param start
* @param count
* @return
*/
public List<Student> getScrollData(int start ,int count){
List<Student> students = new ArrayList<Student>();
db = helper.getWritableDatabase();
Cursor cursor = db.query("t_student", new String[]{"sid","name","age"}, null
, null, null,null, "sid desc",start+","+count);
while(cursor.moveToNext()){
students.add(new Student(cursor.getInt(cursor.getColumnIndex("sid")),cursor.getString(cursor.getColumnIndex("name")),cursor.getInt(cursor.getColumnIndex("age"))));
}
return students;
}
/**
* 统计学生人数
* @return
*/
public long getCount(){
db = helper.getWritableDatabase();
Cursor cursor =db.query("t_student", new String[]{"count(sid)"}, null, null,null,null,null);
if (cursor.moveToNext()) {
return cursor.getLong(0);
}
return 0;
}
}
StudentDAOTwoTest.java测试类更StudentDAOTest.java差不多。
现在讲一下数据库的升级,在android数据存储二中有
DBOpenHelper.java一个类,这个类继承了SQLiteOpenHelper抽象类,重写了两个方法onCreate(SQLiteDatabase sqlitedatabase)和onUpgrade(SQLiteDatabase sqlitedatabase, int i, int j)。
第一个方法就是在没有创建数据库的时候会被调用,而第二个方法就是当我们数据更新的时候调用。
package com.cooguo.sqlite.dao;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBOpenHelper extends SQLiteOpenHelper {
private static final String DBNAME = "data.db";
private static final int VERSION = 2;
public DBOpenHelper(Context context){
super(context, DBNAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqlitedatabase) {
sqlitedatabase.execSQL("create table t_student (sid Integer primary key,name varchar(20),age Integer)");
}
@Override
public void onUpgrade(SQLiteDatabase sqlitedatabase, int i, int j) {
Log.i("StudentDAOTwoTest", "DBOpenHelper-->onUpgrade");
}
}
测试的时候为了可以区别版本号对onUpgrade有响应。在VERSION=1的时候对数据库添加了一条数据,然后在进行了查询,在把VERSION改为2,再进行查询操作,在LogCat输出:
就因为版本号的改变所以会执行onUpgrade方法。如果现在我要改变之前表的结构,增加一个字段sex性别,它的思路应该是这样的。因为如果用户用的该软件要进行表结构的变化,用户用该软件之前可能对数据库中有数据的存储操作,保存了之前有用的数据,如果直接更加表格的结构就有可能把之前存入表的数据被清空,那么就该把之前的数据保留下来,有实现对表结构的改变,现在就要用带onUpgrade这个方法了。你可以把版本号进行改变,运行下面的DBOpenHelper.java类 。
package com.cooguo.sqlite.dao;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBOpenHelper extends SQLiteOpenHelper {
private static final String DBNAME = "data.db";
private static final int VERSION = 3;
private static final String STUDENT = "t_student";
public DBOpenHelper(Context context){
super(context, DBNAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("StudentDAOTwoTest", "DBOpenHelper-->onCreate");
db.execSQL("create table "+STUDENT+" (sid Integer primary key,name varchar(20),age Integer)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int i, int j) {
Log.i("StudentDAOTwoTest", "DBOpenHelper-->onUpgrade");
String temp_table = "temp_student";
db.execSQL("alter table "+STUDENT+" rename to "+temp_table);
db.execSQL("create table "+STUDENT+" (sid Integer primary key,name varchar(20),age Integer,sex varchar(4))");
String sql ="insert into "+STUDENT+"(name,age,sex) select name,age,'男' from "+temp_table;
db.execSQL(sql);
}
}
当运行完这个方法后可以看到数据库的改变:
比
之前多出一个temp_student,你可以查看这两个表的区别,t_student就增加了一个字段,temp_student这个表就跟之前的t_student是一样的。
- android数据存储三
- 【三】Android 数据存储-SharedPreferences
- Android 数据存储(三) 数据库存储
- Android 数据存储(三)之数据库存储
- Android数据存储(三)---File存储
- Android 数据存储(三) 数据库存储
- Android数据存储(三)File 数据外部存储
- Android文档(三)-数据存储
- android数据存储<三>-----Sqlite操作
- Android数据存储技术 (三) : SharedPreferences
- Android的数据存储方式(三)
- Android学习三 数据存储相关
- Android中的数据存储(三):SQLite
- Android 数据存储三种方式
- android数据存储(三)之使用SQLlite数据库存储
- android数据存储(三)之使用SQLlite数据库存储
- Android数据存储(三)----- SQLite数据库存储
- Android(三)数据存储之三SQLite嵌入式数据库
- VirtualBox安装及使用说明和虚拟机安装XP系统图文教程
- 关于 mkimage
- 二分
- eclipse安装SDK插件出现的错误
- 响应式布局入门
- android数据存储三
- Java数组遍历、求最大值、选择排序、冒泡排序、二分查找
- 题目19:打印极值点下标
- POJ3740--Easy Finding
- 处理APMServ无法启动Apache服务
- 三分
- 2484(可参考1025)
- IP归属地查询
- 二进制枚举