Android 的数据存储--SQLite

Android 内嵌了功能比其他手机操作系统强大的关系型数据库sqlite3,我们在大学时候学的SQL语句基本都可以使用,

我们自己创建的数据可以用adb shell来操作。具体路径是/data/data/package_name/databases。

下面给出一个小例子代码:(增删改查操作)

首先把测试环境搭好,,在配置文件中AndroidManifest.xml中引入下面的语句申请相应的功能模块

  <!-- 引用测试库类 -->
       

 <uses-library android:name="android.test.runner"/>
<instrumentation android:name="android.test.InstrumentationTestRunner"
	    android:targetPackage="com.example.db" android:label="My First App">
	</instrumentation>

建立一个Person类 

package com.example.domain;

public class Person {
	private Integer id;
	private String nameString;
	private String phone;
	
	public Person() {
		
	}
	
	public Person( String nameString, String phone) {
		this.nameString = nameString;
		this.phone = phone;
	}
	
	public Person(Integer id, String nameString, String phone) {
		this.id = id;
		this.nameString = nameString;
		this.phone = phone;
	}

	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getNameString() {
		return nameString;
	}
	public void setNameString(String nameString) {
		this.nameString = nameString;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", nameString=" + nameString + ", phone="
				+ phone + "]";
	}
	
	
	
}


在业务层创建:

package com.example.service;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class DBOpenHelper extends SQLiteOpenHelper {

	public DBOpenHelper(Context context) {
		//采用系统默认的游标  最后一个不要为零
		super(context, "itcast.db", null, 2);
	}

	//数据库第一个被创建的时候调用的
	@Override
	public void onCreate(SQLiteDatabase db) {
			db.execSQL("create table person (personid integer primary key autoincrement, name varchar(20))");
	}
 
	//数据库的版本号变更的时候才调用的函数
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("alter table person add phone varchar(12) null");
	}

}
注意:两个函数的区别,调用域不同。

建立PersonService :

package com.example.service;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.example.domain.Person;


public class PersonService {
	private DBOpenHelper dbOpenHelper;

	public PersonService(Context context) {
		// 以上下文对象进行传入
		this.dbOpenHelper = new DBOpenHelper(context);
	}

	/*
	 * 添加记录
	 * 
	 * @param person
	 */
	public void save(Person person) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		// 采用占位符的思想屏蔽掉字符串的特出性。。保证安全性
		db.execSQL("insert into person(name,phone) values (?,?)", new Object[] {
				person.getNameString(), person.getPhone() });
	}
	
	public void delete(Integer id) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		// 采用占位符的思想屏蔽掉字符串的特出性。。保证安全性
		db.execSQL("delete from person where personid=?", new Object[] { id });

	}

	public void update(Person person) {
		SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
		// 采用占位符的思想屏蔽掉字符串的特出性。。保证安全性
		db.execSQL("update person set name=?,phone=? where personid=?",
				new Object[] { person.getNameString(), person.getPhone(),
						person.getId() });

	}

	public Person find(Integer id) {
		// 区别:不满,,就一样,,如果存储空间满了,只能读不能写
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		// Cursor可以动态的查询结果,随机访问
		Cursor cursor = db.rawQuery("select * from person where personid=?",
				new String[] { id.toString() });
		if (cursor.moveToFirst()) {
			int personid = cursor.getInt(cursor.getColumnIndex("personid"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			String phone = cursor.getString(cursor.getColumnIndex("phone"));
			return new Person(personid, name, phone);
		}
		cursor.close();
		return null;
	}

	// 数据分页
	/*@param offset 跳过前面多少页
	 * @param  maxResult  每页获取到多少条记录
	 * 
	 * */
	public List<Person> getScrollDate(int offset, int maxResult) {
		List<Person> persons = new ArrayList<Person>();

		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		// Cursor可以动态的查询结果,随机访问
		Cursor cursor = db.rawQuery(
				"select * from person order by personid asc limit ?,?",
				new String[] { String.valueOf(offset),
						String.valueOf(maxResult) });
		while (cursor.moveToNext()) {
			int personid = cursor.getInt(cursor.getColumnIndex("personid"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			String phone = cursor.getString(cursor.getColumnIndex("phone"));
			persons.add(new Person(personid, name, phone));

		}
		cursor.close();
		return persons;
	}
		//获取总记录
	public long getCount() {
		SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
		// Cursor可以动态的查询结果,随机访问
		Cursor cursor = db.rawQuery("select count(*) from person ", null);
		cursor.moveToFirst();
		long result = cursor.getLong(0);
		return result;
	}

}

下面建立测试类进行测试:

package com.example.test;

import java.util.List;

import com.example.domain.Person;
import com.example.service.DBOpenHelper;
import com.example.service.PersonService;

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

public class PersonServiceTest extends AndroidTestCase {
	private static final String TAG="PersonServiceTest";
	
	public void testCreateDB() throws Exception{
		//传入上下文对象
		DBOpenHelper dbOpenHelper=new DBOpenHelper(getContext());
		//此方法自动创建数据库
		dbOpenHelper.getWritableDatabase();
	}
	public void  testSave()throws Exception{
		PersonService service =new PersonService(this.getContext());
		for(int i=0;i<20;i++){
			Person person=new Person("zhangxx"+i,"18363857200"+i);
			service.save(person);
			
		}
		
	}
	public void  testDelete()throws Exception{
		PersonService service =new PersonService(this.getContext());
		service.delete(21);
			
		}
	public void  testUpdate()throws Exception{
		PersonService service =new PersonService(this.getContext());
		Person person=service.find(1);
		person.setNameString("zhaoxiaoxiao");
		service.update(person);
		
	}
	public void  testFind()throws Exception{
		PersonService service =new PersonService(this.getContext());
		Person person=service.find(1);
		Log.i(TAG, person.toString());
	}
	public void  testScrollData()throws Exception{
		PersonService service =new PersonService(this.getContext());
		List<Person> persons=service.getScrollDate(0, 5);
		for(Person p:persons){
			Log.i(TAG, p.toString());
		}
	}
	public void testCount()throws Exception {
		PersonService service =new PersonService(this.getContext());
		long result=service.getCount();
		//技巧,,返回的是字符串
		Log.i(TAG, result+"");
	}
}


在测试类中 PersonService service =new PersonService(this.getContext());这句话不能被提取到方法之外生成共鸣,因为只有在初始化之后才会产生上下文对象。

你可能感兴趣的:(Android 的数据存储--SQLite)