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是一样的。

原创粉丝点击