大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > Android技巧 > 安卓 SQLite数据库操作实例

安卓 SQLite数据库操作实例

关键词:实例操作数据库SQLite  阅读(912) 赞(16)

[摘要]本文是对安卓 SQLite数据库操作实例的讲解,对学习Android编程技术有所帮助,与大家分享。

前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了。

在Android 运行时环境包含了完整的 SQLite。

首先介绍一下SQLite这个数据库:

SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。

有一点相对其他数据库来说比较特殊的是:SQLite是无类型的. 这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中,意思就是说话你可以在创建数据库表的时候任意定义数据类型,却不影响实际使用时的数据存储。

举个例子说就是你可以在创建表时定义username字段为varchar类型,但是实时使用时你可以向这个字段存入1、2.5、2012-6-6.。。这样的整型,单精,以及时间等其他类型,在SQLite里没有这种限制。

但是有一种情况例外:当字段类型为”Integer Primary Key”时,就是定义表主键,这个就只能是integer类型。和普通数据库相同 。

SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。

需要注意一点:SQLite不支持存储过程!

我这里就简单介绍,如需要可自行去了解关于SQLite的更多知识,

然后是我的Demo(一个简单的完成数据库增删查改操作):

首先是项目目录结构:


<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="org.yzsoft.sqlitedemo.test"
android:versionCode="1"
android:versionName="1.0">

<!--为了方便测试,我直接把上面包位置改成我项目的测试包下-->
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15"/>

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">

<!--
因为我们开发项目的时候,包会比较多,所以最好在下面这个activity的配置(android:name="org.yzsoft.sqlitedemo.activity.MainActivity")这句这里打上完整的包名.类名
,虽然可以直接用.类名,但是这个.类名是建立在
<manifestxmlns:android="http://schemas.android.com/apk/res/android"package="org.yzsoft.sqlitedemo.test"
之上的,用package+.类名也刚好可以组合成完整路径。但是我们保险一点写完整去。
-->
<activity
android:name="org.yzsoft.sqlitedemo.activity.MainActivity"
android:label="@string/title_activity_main">
<intent-filter>
<actionandroid:name="android.intent.action.MAIN"/>

<categoryandroid:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<!--JUnit要加这句-->
<uses-libraryandroid:name="android.test.runner"/>
</application>
<!--JUnit还要加这段(android:targetPackage测试类所在包名)-->
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:label="TestUnitTests"
android:targetPackage="org.yzsoft.sqlitedemo.test">
</instrumentation>

</manifest>



1、MainActivity.java(因为本项目中使用JUnit进行测试,就不需要Activity了,留着不用写它)

Java代码
packageorg.yzsoft.sqlitedemo.activity;

importorg.yzsoft.sqlitedemo.util.R;
importorg.yzsoft.sqlitedemo.util.R.layout;
importorg.yzsoft.sqlitedemo.util.R.menu;

importandroid.os.Bundle;
importandroid.app.Activity;
importandroid.view.Menu;

publicclassMainActivityextendsActivity{

@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
publicbooleanonCreateOptionsMenu(Menumenu){
getMenuInflater().inflate(R.menu.activity_main,menu);
returntrue;
}
}



2、DBOpenHandler.java

Java代码
packageorg.yzsoft.sqlitedemo.util;

importandroid.content.Context;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteDatabase.CursorFactory;
importandroid.database.sqlite.SQLiteOpenHelper;

publicclassDBOpenHandlerextendsSQLiteOpenHelper{

/**
*
*@paramcontext
*上下文
*@paramname
*数据库名
*@paramfactory
*可选的数据库游标工厂类,当查询(query)被提交时,该对象会被调用来实例化一个游标。默认为null。
*@paramversion
*数据库版本号
*/
publicDBOpenHandler(Contextcontext,Stringname,CursorFactoryfactory,intversion){
super(context,name,factory,version);
}

@Override
publicvoidonCreate(SQLiteDatabasedb){//覆写onCreate方法,当数据库创建时就用SQL命令创建一个表
//创建一个t_users表,id主键,自动增长,字符类型的username和pass;
db.execSQL("createtablet_users(idintegerprimarykeyautoincrement,usernamevarchar(200),passvarchar(200))");

}

@Override
publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
//TODOAuto-generatedmethodstub

}

}



3、TUsers.java(实体类,习惯了WEB开发,总会加个实体类,方便)

Java代码
packageorg.yzsoft.sqlitedemo.vo;

publicclassTUsers{
privateintid;
privateStringusername;
privateStringpass;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetPass(){
returnpass;
}
publicvoidsetPass(Stringpass){
this.pass=pass;
}
}



4、SQLiteDAOImpl.java(数据库操作实现类)

Java代码
packageorg.yzsoft.sqlitedemo.util;

importjava.util.ArrayList;
importjava.util.List;
importorg.yzsoft.sqlitedemo.vo.TUsers;

importandroid.content.Context;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;

publicclassSQLiteDAOImpl{
privateDBOpenHandlerdbOpenHandler;

publicSQLiteDAOImpl(Contextcontext){
this.dbOpenHandler=newDBOpenHandler(context,"dbtest.db",null,1);
}

publicvoidsave(TUserstusers){//插入记录
SQLiteDatabasedb=dbOpenHandler.getWritableDatabase();//取得数据库操作
db.execSQL("insertintot_users(username,pass)values(?,?)",newObject[]{tusers.getUsername(),tusers.getPass()});
db.close();//记得关闭数据库操作
}

publicvoiddelete(Integerid){//删除纪录
SQLiteDatabasedb=dbOpenHandler.getWritableDatabase();
db.execSQL("deletefromt_userswhereid=?",newObject[]{id.toString()});
db.close();
}

publicvoidupdate(TUserstusers){//修改纪录
SQLiteDatabasedb=dbOpenHandler.getWritableDatabase();
db.execSQL("updatet_userssetusername=?,pass=?where"+"id=?",newObject[]{tusers.getUsername(),tusers.getPass(),tusers.getId()});
db.close();
}

publicTUsersfind(Integerid){//根据ID查找纪录
TUserstusers=null;
SQLiteDatabasedb=dbOpenHandler.getReadableDatabase();
//用游标Cursor接收从数据库检索到的数据
Cursorcursor=db.rawQuery("select*fromt_userswhereid=?",newString[]{id.toString()});
if(cursor.moveToFirst()){//依次取出数据
tusers=newTUsers();
tusers.setId(cursor.getInt(cursor.getColumnIndex("id")));
tusers.setUsername(cursor.getString(cursor.getColumnIndex("username")));
tusers.setPass(cursor.getString(cursor.getColumnIndex("pass")));

}
db.close();
returntusers;
}

publicList<TUsers>findAll(){//查询所有记录
List<TUsers>lists=newArrayList<TUsers>();
TUserstusers=null;
SQLiteDatabasedb=dbOpenHandler.getReadableDatabase();
//Cursorcursor=db.rawQuery("select*fromt_userslimit?,?",new
//String[]{offset.toString(),maxLength.toString()});
////这里支持类型MYSQL的limit分页操作

Cursorcursor=db.rawQuery("select*fromt_users",null);
while(cursor.moveToNext()){
tusers=newTUsers();
tusers.setId(cursor.getInt(cursor.getColumnIndex("id")));
tusers.setUsername(cursor.getString(cursor.getColumnIndex("username")));
tusers.setPass(cursor.getString(cursor.getColumnIndex("pass")));
lists.add(tusers);
}
db.close();
returnlists;
}

publiclonggetCount(){//统计所有记录数
SQLiteDatabasedb=dbOpenHandler.getReadableDatabase();
Cursorcursor=db.rawQuery("selectcount(*)fromt_users",null);
cursor.moveToFirst();
db.close();
returncursor.getLong(0);
}

}



5、TUsersTest.java(JUnit测试类)

Java代码
packageorg.yzsoft.sqlitedemo.test;

importjava.util.List;

importorg.yzsoft.sqlitedemo.util.DBOpenHandler;
importorg.yzsoft.sqlitedemo.util.SQLiteDAOImpl;
importorg.yzsoft.sqlitedemo.vo.TUsers;

importandroid.test.AndroidTestCase;
importandroid.util.Log;

publicclassTUsersTestextendsAndroidTestCase{
privatestaticfinalStringTAG="这个是测试类";//准备好TAG标识用于LOG输出,方便我们用LogCat进行调试

publicvoidtestCreate(){
DBOpenHandlerdbHandler=newDBOpenHandler(this.getContext(),"dbtest.db",null,1);//创建数据库文件
dbHandler.getWritableDatabase();
}

publicvoidtestSave()throwsThrowable{
SQLiteDAOImplp=newSQLiteDAOImpl(this.getContext());
TUserstuser=newTUsers();
tuser.setUsername("用户");
tuser.setPass("密码");
p.save(tuser);
Log.i(TAG,"插入成功");//用日志记录一个我们自定义的输出。可以在LogCat窗口中查看,方便调试
}

publicvoidtestUpate()throwsThrowable{
SQLiteDAOImplp=newSQLiteDAOImpl(this.getContext());
TUserstuser=p.find(1);
tuser.setUsername("张三");
p.update(tuser);
Log.i(TAG,"修改成功");
}

publicvoidtestDelete()throwsThrowable{
SQLiteDAOImplp=newSQLiteDAOImpl(this.getContext());
p.delete(2);
Log.i(TAG,"删除成功");
}

publicvoidtestFind()throwsThrowable{
SQLiteDAOImplp=newSQLiteDAOImpl(this.getContext());
TUserstuser=p.find(1);
Log.i(TAG,tuser.getUsername()+"用户名");
}

publicvoidtestGetCount()throwsThrowable{
SQLiteDAOImplp=newSQLiteDAOImpl(this.getContext());
Log.i(TAG,p.getCount()+"总记录数");
}

publicvoidtestFindAll()throwsThrowable{
SQLiteDAOImplp=newSQLiteDAOImpl(this.getContext());
List<TUsers>tusers=p.findAll();
for(TUserstuser:tusers){
Log.i(TAG,tuser.getUsername()+"用户名");
}
}
}



然后是测试中的一些截图:











最后我们把File Exploer中data/data/项目包名/databases/dbtest.db 导出来,用Navicat Premium等数据库管理工具查看里面的数据:


导出来看看:


虽然安卓平台中SQLite是个小型的本地数据库,但是有些地方使用起来会比文件存储更方便,本文只是对它作一个简单的操作实例 ,有这方面兴趣的童鞋可以自己去深入研究。也希望大家能多交流交流~~~~

最最后~附上项目源码:

    SQLiteDemo.rar(675.4 KB)
踩0 踩一下 顶16 赞一个

相关Android技巧推荐

暂时没有相关推荐



相关评论