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的應用講述可能有點草率,但是認真看看文檔,認真瞭解其中的基礎,在應用中操作可能就會更加了解它。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章