一)開發前準備工作,下載SQLite Expert工具(SQLite的可視化工具),大家可以去搜一下
? ? ? ?
二)工具準備好了,咱們開始開發吧
先貼一下項目的目錄結構:
1.寫一個獲得創建修改數據庫的工具類,這個類繼承自 SQLiteOpenHelper
?
package com.xiaobo.service;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DbOpenHelper extends SQLiteOpenHelper{
public DbOpenHelper(Context context) {// 初始化時把數據庫名和版本帶上
super(context, "itxiaobo.db", null, 3);
}
@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 amount INTEGER NULL ");
}
}
?
?
2.然后再下一個測試類PersonServiceTest,測試一下是否成功創建的數據庫和表
? ?
package com.xiaobo.juit;
import java.util.List;
import android.test.AndroidTestCase;
import android.util.Log;
import com.xiaobo.domain.Person;
import com.xiaobo.service.DbOpenHelper;
import com.xiaobo.service.PersonService;
public class PersonServiceTest extends AndroidTestCase{
// 本測試類的專有TAG標簽,利于LogCat調試
private final static String TAG = "PersonServiceTest";
/**
* 測試創建或更改數據庫
* @throws Throwable
*/
public void testCreateDb() throws Throwable{
DbOpenHelper dbOpenHelper = new DbOpenHelper(getContext());
dbOpenHelper.getWritableDatabase();
}
}
?
? ?備注:寫單元測試時得在AndroidManifest.xml配置一下,看下圖
? ?
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xiaobo.db"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="3"
android:targetSdkVersion="17" />
<instrumentation android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.xiaobo.db"
android:label="JUnit Test"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- 單元測試的library -->
<uses-library android:name="android.test.runner" />
<activity
android:name="com.xiaobo.db.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>
</manifest>
?
3.寫業務邏輯類PersonService,其中包含了增上改查,看代碼吧
??
package com.xiaobo.service;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.xiaobo.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, amount) values(?,?)", new Object[]{person.getName(), person.getPhone(), person.getAmount()});
}
/**
* 根據id刪除記錄
* @param id
*/
public void delete(Integer id){
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
db.execSQL("delete from person where personid=?", new Object[]{id});
}
/**
* 更新記錄
* @param person
*/
public void update(Person person){
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
db.execSQL("update person set name=?, phone=?, amount=? where personid=?", new Object[]{person.getName(), person.getPhone(),person.getAmount(), person.getId()});
}
/**
* 根據id查找一條記錄
* @param id
* @return
*/
public Person find(Integer id){
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
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"));
int amount = cursor.getInt(cursor.getColumnIndex("amount"));
return new Person(personid, name, phone, amount);
}
return null;
}
/**
* 查詢翻頁記錄
* @param offset
* @param maxResult
* @return
*/
public List<Person> getScrollData(int offset, int maxResult){
List<Person> persons = new ArrayList<Person>();
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
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"));
int amount = cursor.getInt(cursor.getColumnIndex("amount"));
persons.add(new Person(personid, name, phone, amount));
}
cursor.close();
return persons;
}
/**
* 獲取記錄總數
* @return
*/
public long getCount(){
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
Cursor cursor = db.rawQuery("select count(*) from person", null);
cursor.moveToFirst();
long count = cursor.getLong(0);
return count;
}
/**
* 轉賬匯款事務
* @param fromId 匯款賬戶
* @param toId 接收賬戶
*/
public void payment(Integer fromId, Integer toId){
SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
db.beginTransaction(); // 開啟事務
try{
db.execSQL("update person set amount=amount-500 where personid=?", new Object[]{fromId});
db.execSQL("update person set amount=amount+500 where personid=?", new Object[]{toId});
// 結束事務有兩種情況,要么commit,要么rollback,是根據事務的標志決定的,默認為False,如果為True,就會提交
db.setTransactionSuccessful();
}finally{
db.endTransaction(); // 結束事務
}
}
}
?
4.在先前創建的PersonServiceTest類里面寫其他的測試方法,上代碼
??
package com.xiaobo.juit;
import java.util.List;
import android.test.AndroidTestCase;
import android.util.Log;
import com.xiaobo.domain.Person;
import com.xiaobo.service.DbOpenHelper;
import com.xiaobo.service.PersonService;
public class PersonServiceTest extends AndroidTestCase{
// 本測試類的專有TAG標簽,利于LogCat調試
private final static String TAG = "PersonServiceTest";
/**
* 測試創建或更改數據庫
* @throws Throwable
*/
public void testCreateDb() throws Throwable{
DbOpenHelper dbOpenHelper = new DbOpenHelper(getContext());
dbOpenHelper.getWritableDatabase();
}
/**
* 測試保存
* @throws Throwable
*/
public void testSave() throws Throwable{
PersonService personService = new PersonService(getContext());
personService.save(new Person(1, "yellow", "18706487378", 2000));
personService.save(new Person(2, "yuan", "18706697820", 3000));
personService.save(new Person(3, "zhen", "13658662813", 4000));
}
/**
* 測試根據id查找一條記錄
* @throws Throwable
*/
public void testFind() throws Throwable{
PersonService personService = new PersonService(getContext());
Person person = personService.find(1);
Log.i(TAG, person.toString());
}
/**
* 測試更新記錄
* @throws Throwable
*/
public void testUpdate() throws Throwable{
PersonService personService = new PersonService(getContext());
personService.update(new Person(2, "yellow", "18706487378", 5000));
personService.update(new Person(3, "yuan", "18706697820", 5000));
}
/**
* 測試刪除記錄
* @throws Throwable
*/
public void testDelete() throws Throwable{
PersonService personService = new PersonService(getContext());
personService.delete(1);
}
/**
* 測試獲得記錄總條數
* @throws Throwable
*/
public void testGetCount() throws Throwable{
PersonService personService = new PersonService(getContext());
Log.i(TAG, String.valueOf(personService.getCount()));
}
/**
* 測試分頁記錄
* @throws Throwable
*/
public void testGetScrollData() throws Throwable{
PersonService personService = new PersonService(getContext());
List<Person> persons = personService.getScrollData(0, 5);
for(Person person :persons){
Log.i(TAG, person.toString());
}
}
/**
* 測試轉賬匯款
* @throws Throwable
*/
public void testUpdateAmount() throws Throwable{
PersonService personService = new PersonService(getContext());
Person p01 = personService.find(2);
Person p02 = personService.find(3);
System.out.println(p01.toString());
System.out.println(p02.toString());
p01.setAmount(500);
p02.setAmount(600);
personService.update(p01);
personService.update(p02);
Log.i(TAG, p01.getAmount().toString());
Log.i(TAG, p02.getAmount().toString());
}
/**
* 測試轉賬匯款2
* @throws Throwable
*/
public void testPayment() throws Throwable{
PersonService personService = new PersonService(getContext());
Person p01 = personService.find(2);
Person p02 = personService.find(3);
// 打印轉賬之前賬戶信息
Log.i(TAG, p01.toString());
Log.i(TAG, p02.toString());
personService.payment(2, 3);
// 再次打印轉賬之后賬戶信息
Log.i(TAG, p01.toString());
Log.i(TAG, p02.toString());
}
}
?
5.大家可以下源代碼看一下,不是很會寫原理,呵呵,希望大家共同進步
? ?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

