Android 个人理财工具二:使用SQLite实现启动时初始化数据
关于SQLite
sqlite是嵌入式SQL数据库引擎SQLite(SQLiteEmbeddableSQLDatabaseEngine)的一个扩展。SQLite是一个实现嵌入式SQL数据库引擎小型C语言库(Clibrary),实现了独立的,可嵌入的,零配置的SQL数据库引擎。特性包括:事务操作是原子,一致,孤立,并且持久的,即使在系统崩溃和电源故障之后。零配置——不需要安装和管理。实现了绝大多数SQL92标准。
我在多年前就关注sqlite的发展,非常看好sqlite的前景,因为在移动、嵌入式的应用里面,sqlite具有非常好的特性来满足需求。
早在symbian9.0之前,openc出来后,我就研究sqlite到symbian的移植。后来symbian9.3nokia就已经集成了sqlite。
至今j2me还不支持sqlite,可以说是个遗憾。
现在我们来看看androidsqlitedatabase包里面的关键api:
Java代码
staticSQLiteDatabaseopenOrCreateDatabase(Stringpath,SQLiteDatabase.CursorFactoryfactory)//打开数据库 Cursorquery(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy,Stringlimit)//执行查询SQL voidexecSQL(Stringsql)//执行非查询sql
sdk1.0关于cursor和sqlite的相关api对于前面的版本改变很多。
我觉得关键是没了query(Stringsql)这个简单的方法了,很不爽。
不过如果你对新的query方法了解深入点,发现其实也就一样。
实例代码
我们来看两个例子。
Java代码
//执行selecttype,namefromsqlite_masterwherename='colaconfig'
Stringcol[]={"type","name"};
Cursorc=db.query("sqlite_master",col,"name='colaconfig'",null,null,null,null);
intn=c.getCount();
//执行多表查询
//selectfee,descfromacctitea,billsbwherea.id=b.id
Stringcol2[]={"fee","desc"};
Cursorc2=db.query("acctitema,billsb",col,"a.id=b.id",null,null,null,null);
intn2=c2.getCount();
Log.v("cola","c2.getCount="+n2+"");
c2.moveToFirst();
intk=0;
while(!c2.isAfterLast()){
Stringss=c2.getString(0)+","+c2.getString(1);
c2.moveToNext();
Log.v("cola","ss="+ss+"");
}
现在来看看我们如何在这个理财工具里面应用它。
我们需要在程序的第一次启动时,创建数据库,然后把基本的表创建好,并且初始化好账目表。
对于上一篇中的initapp方法,我们需要改造成:
Java代码
publicvoidinitApp(){
BilldbHelperbilldb=newBilldbHelper(this);
billdb.FirstStart();
billdb.close();
}
下面我们给出BilldbHelper.java代码:
Java代码
packagecom.cola.ui;
importandroid.content.Context;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.util.Log;
/**
*Providesaccesstoadatabaseofnotes.Eachnotehasatitle,thenote
*itself,acreationdateandamodifieddata.
*/
publicclassBilldbHelper{
privatestaticfinalStringTAG="Cola_BilldbHelper";
privatestaticfinalStringDATABASE_NAME="cola.db";
SQLiteDatabasedb;
Contextcontext;
BilldbHelper(Context_context){
context=_context;
db=context.openOrCreateDatabase(DATABASE_NAME,0,null);//创建数据库
Log.v(TAG,"dbpath="+db.getPath());
}
publicvoidCreateTable_acctitem(){
try{
db.execSQL("CREATETABLEacctitem("//创建账目表
+"IDINTEGERPRIMARYKEY,"
+"PIDinteger,"
+"NAMETEXT,"
+"TYPEINTEGER"
+");");
Log.v("cola","CreateTableacctitemok");
}catch(Exceptione){
Log.v("cola","CreateTableacctitemerr,tableexists.");
}
}
publicvoidCreateTable_bills(){
try{
db.execSQL("CREATETABLEbills("
+"IDINTEGERPRIMARYKEY,"
+"feeinteger,"
+"useridinteger,"
+"sdateTEXT,"
+"stimeTEXT,"
+"descTEXT"
+");");
Log.v("cola","CreateTableacctitemok");
}catch(Exceptione){
Log.v("cola","CreateTableacctitemerr,tableexists.");
}
}
publicvoidCreateTable_colaconfig(){
try{
db.execSQL("CREATETABLEcolaconfig("
+"IDINTEGERPRIMARYKEY,"
+"NAMETEXT"
+");");
Log.v("cola","CreateTablecolaconfigok");
}catch(Exceptione){
Log.v("cola","CreateTableacctitemerr,tableexists.");
}
}
publicvoidInitAcctitem(){
db.execSQL("insertintoacctitemvalues(100,0,'收入',0)");
db.execSQL("insertintoacctitemvalues(100100,100,'工资',0)");
db.execSQL("insertintoacctitemvalues(200,0,'支出',1)");
db.execSQL("insertintoacctitemvalues(200100,200,'生活用品',1)");
db.execSQL("insertintoacctitemvalues(200101,200,'水电煤气费',1)");
db.execSQL("insertintoacctitemvalues(200103,200,'汽油费',1)");
Log.v("cola","insertintook");
}
publicvoidQueryTable_acctitem(){
}
publicvoidFirstStart(){
//如果是第一次启动,就不存在colaconfig这张表.
try{
Stringcol[]={"type","name"};
Cursorc=db.query("sqlite_master",col,"name='colaconfig'",null,null,null,null);
intn=c.getCount();
if(c.getCount()==0){
CreateTable_acctitem();
CreateTable_colaconfig();
CreateTable_bills();
InitAcctitem();
}
Log.v("cola","c.getCount="+n+"");
}catch(Exceptione){
Log.v("cola","e="+e.getMessage());
}
}
publicvoidclose(){
db.close();
}
}
系列文章:
Android个人理财工具六:显示账单明细下
Android个人理财工具五:显示账单明细上
Android个人理财工具四:添加账单页面下
Android个人理财工具三:添加账单页面上
Android个人理财工具二:使用SQLite实现启动时初始化数据
Android个人理财工具一:项目概述与启动界面的实现
以上就是对AndroidSQL的讲解及实例,后续继续做个人理财项目,谢谢大家支持!