android数据存储二

在android数据存储一种主要说了一下android数据存储有哪集中数据类型,顺便提了一下第一种存储方式SQLite的数据存储方式有几种数据类型,而对SQLite的一些复习应用就没有写出来,大家可以自己查一些SQLite一些基本用法。在android数据存储二中,来讲一下SQLite在android中的一些应用。

   在写实例之前先来了解一下 SQLiteOpenHelper:

A helper class to manage database creation and version management.

You create a subclass implementing onCreate(SQLiteDatabase)onUpgrade(SQLiteDatabase, int, int) and optionally onOpen(SQLiteDatabase), and this class takes care of opening the database if it exists, creating it if it does not, and upgrading it as necessary. Transactions are used to make sure the database is always in a sensible state.

This class makes it easy for ContentProvider implementations to defer opening and upgrading the database until first use, to avoid blocking application startup with long-running database upgrades.

下面写了一个测试项目来测试一下SQLite在android项目中的应用:


此项目主要采用MVC思想来写其中DBOpenHelper.java的代码如下:

package com.cooguo.sqlite.dao;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBOpenHelper extends SQLiteOpenHelper {
private static final String DBNAME = "data.db";
private static final int VERSION = 1;
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) {
// TODO Auto-generated method stub

}
}

而StudentDAO.java类的代码如下:

package com.cooguo.sqlite.dao;
import java.util.ArrayList;
import java.util.List;
import com.cooguo.sqlite.model.Student;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class StudentDAO {
     private DBOpenHelper helper;
     private SQLiteDatabase db;
     
     public StudentDAO(Context context){
    helper = new DBOpenHelper(context);
     }
     
     /**
      * 添加学生信息
      * @param student
      */
    public void add(Student student){
    db = helper.getWritableDatabase();
    db.execSQL("insert into t_student (sid,name,age) values (?,?,?) ",new Object[]
    {student.getSid(),student.getName(),student.getAge()});
   
    }
    
   /**
    * 更新学生信息
    * @param studnet
    */
    public void update(Student studnet){
    db = helper.getWritableDatabase();
    db.execSQL("update t_student set name = ? ,age =? where sid = ?",new Object[]
    {studnet.getName(),studnet.getAge(),studnet.getSid()});
    }
     
    /**
     * 更加学生ID查询学生信息
     * @param stuId
     * @return
     */
    public Student find(int stuId){
    db = helper.getWritableDatabase();
    Cursor cursor = db.rawQuery("select sid,name,age from t_student where sid=?", new String[]{String.valueOf(stuId)});
    if(cursor.moveToNext()){
    return new Student(cursor.getInt(cursor.getColumnIndex("sid")), cursor.getString(cursor.getColumnIndex("name")), cursor.getInt(cursor.getColumnIndex("age")));
    }
    return null;
    }
    /**
     * 根据ID删除相应的学生信息
     * @param ids
     */
    public void delete(Integer... ids){
    if(ids.length>0){
    StringBuffer sb = new StringBuffer();
    for(int i=0;i<ids.length;i++){
    sb.append("?").append(",");
    }
    sb.deleteCharAt(sb.length()-1);
    db = helper.getWritableDatabase();
    db.execSQL("delete from t_student where sid in ("+sb+")", (Object[])ids);
   
    }
    }
    
    /**
     * 分页获取学生信息
     * @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.rawQuery("select sid,name,age from t_student limit ?,? ", new String[]{String.valueOf(start),String.valueOf(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.rawQuery("select count(sid) from t_student ", null);
    if (cursor.moveToNext()) {
return cursor.getLong(0);
}
    return 0;
    }
}

因为写项目的时候不可能一下子写完了就进行一直写,你写完一部分就要进行一步一步的测试,一样才能保证项目的正确性,所以我在项目中也进行了DAO层的测试操作:

StudentDAOTest.java的测试代码如下:

package com.cooguo.sqlite.activity;


import java.util.List;


import com.cooguo.sqlite.dao.StudentDAO;
import com.cooguo.sqlite.model.Student;


import android.test.AndroidTestCase;
import android.util.Log;


/**
 * android测试类
 * @author Lenovo
 *
 */
public class StudentDAOTest extends AndroidTestCase {

private static final String TAG = "StudentDAOTest";

public void testAdd() {
StudentDAO studentDAO = new  StudentDAO(this.getContext());
Student student1 = new Student(2,"zhangsan",23);
Student student2 = new Student(3,"lisi",20);
Student student3 = new Student(4,"wangwu",25);
studentDAO.add(student1);
studentDAO.add(student2);
studentDAO.add(student3);
Log.i(TAG,"testAdd success");

}

public void testUpdate() {
StudentDAO studentDAO = new  StudentDAO(this.getContext());
Student student = studentDAO.find(1);
student.setName("kaifa");
studentDAO.update(student);
Log.i(TAG, "testUpdate success");
}
public void testFind() {
StudentDAO studentDAO = new  StudentDAO(this.getContext());
Student student = studentDAO.find(1);
if (null == student) {
Log.i(TAG, "student not find");
}else {
Log.i(TAG, "student: "+student.getSid()+"  "+student.getName()+"  "+student.getAge());
}


}

public void testDelete() {
StudentDAO studentDAO = new  StudentDAO(this.getContext());
studentDAO.delete(1,2);
Log.i(TAG, "testDelete success");
}
public void testGetScrollData() {
StudentDAO studentDAO = new  StudentDAO(this.getContext());
List<Student> students = studentDAO.getScrollData(0, 1);
for (Student student :students) {
Log.i(TAG, student.getName());
}

}

public void testGetCount() {
StudentDAO studentDAO = new  StudentDAO(this.getContext());
long count = studentDAO.getCount();
Log.i(TAG, "testGetCount success"+count);
}


}

在安卓项目中要进行android应用的测试就必须继承AndroidTestCase类,而且还要在AndroidManifest.xml文件中进行测试的一些配置,配置文件如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.cooguo.sqlite.activity"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <uses-library android:name="android.test.runner"/>
        <activity android:name=".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>
    </application>
    <instrumentation 
      android:name="android.test.InstrumentationTestRunner"
      android:targetPackage="com.cooguo.sqlite.activity"
      android:label="Test My App"
    />
    
</manifest>

由于时间关系,对SQLite数据库在android的应用讲述可能有点草率,但是认真看看文档,认真了解其中的基础,在应用中操作可能就会更加了解它。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值