Android中数据存储--采用SQLite存储数据及在SDCard中创建数据库
分类:Android 进阶
2011-06-30 23:30
4478人阅读
收藏
举报
存储
android
sqlite
数据库
layout
string
SQLite数据库简单的认识
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha诞生于2000年5月. 至今已经有10个年头,SQLite也迎来了一个版本 SQLite 3已经发布。
SQLite特性
下面是访问SQLite官方网站: http://www.sqlite. org/ 时第一眼看到关于SQLite的特性.
1. ACID事务
2. 零配置 – 无需安装和管理配置
3. 储存在单一磁盘文件中的一个完整的数据库
4. 数据库文件可以在不同字节顺序的机器间自由的共享
5. 支持数据库大小至2TB
6. 足够小,大致3万行C代码,250K
7. 比一些流行的数据库在大部分普通数据库操作要快
8. 简单,轻松的API
9. 包含TCL绑定,同时通过Wrapper支持其他语言的绑定
10. 良好注释的源代码,并且有着90%以上的测试覆盖率
11. 独立: 没有额外依赖
12. Source完全的Open,你可以用于任何用途,包括出售它
13. 支持多种开发语言,C,PHP,Perl,Java,ASP .NET,Python
下面我以一个完整的Demo例子来展示对SQLite数据库操作,包括对数据库表的增、删、改、查等基本操作。下面的一个截图是该演示Demo的项目框架图:
通过上面的截图可以看到该项目src目录下包含两个类:MainActivity.java 和 MySQLiteOpenHelper.java 。其中MySQLiteOpenHelper.java是对数据库操作辅助类。
布局文件main.xml的代码:
[c-sharp]
view plain
copy
- <?xmlversion="1.0"encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <TextViewandroid:id="@+id/tv_title"
- android:layout_width="fill_parent"android:layout_height="wrap_content"
- android:text="Hello,WelcometoAndy'sblog!"android:textSize="16sp"/>
-
- <Buttonandroid:id="@+id/newTable"android:layout_width="fill_parent"
- android:layout_height="wrap_content"android:text="1.新建数据表"/>
- <Buttonandroid:id="@+id/addOne"android:layout_width="fill_parent"
- android:layout_height="wrap_content"android:text="2.插入一条记录"/>
- <Buttonandroid:id="@+id/query"android:layout_width="fill_parent"
- android:layout_height="wrap_content"android:text="3.查询数据库"/>
- <Buttonandroid:id="@+id/editOne"android:layout_width="fill_parent"
- android:layout_height="wrap_content"android:text="4.修改一条记录"/>
- <Buttonandroid:id="@+id/deleteOne"android:layout_width="fill_parent"
- android:layout_height="wrap_content"android:text="5.删除一条记录"/>
- <Buttonandroid:id="@+id/deleteTable"android:layout_width="fill_parent"
- android:layout_height="wrap_content"android:text="6.删除数据表"/>
-
- <TextViewandroid:id="@+id/tv_result"
- android:layout_width="fill_parent"android:layout_height="wrap_content"
- android:text="测试显示的结果"android:textSize="16sp"/>
- </LinearLayout>
MainActivity.java代码:
copy
packagecom.andyidea.sqlite;
- importjava.io.File;
- importjava.io.IOException;
- importandroid.app.Activity;
- importandroid.content.ContentValues;
- importandroid.database.Cursor;
- importandroid.database.sqlite.SQLiteDatabase;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- importandroid.widget.TextView;
- importandroid.widget.Toast;
- publicclassMainActivityextendsActivity{
- privateButtonbtn_newTable,btn_addOne,btn_query,
- btn_editOne,btn_deleteOne,btn_deleteTable;
- privateTextViewtv;
- privateMySQLiteOpenHelpermyOpenHelper;
- privateSQLiteDatabasesqlitedb;
-
-
- //privateFilef=newFile("/sdcard/dbfile/AndyDemo.db");//数据库文件
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- voidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- initializeViews();
- //实例化默认数据库辅助操作对象
- myOpenHelper=newMySQLiteOpenHelper(this);
- //----如要在SD卡中创建数据库文件,先做如下的判断和创建相对应的目录和文件----
- //if(!path.exists()){//判断目录是否存在
- //path.mkdirs();//创建目录
- //}
- //if(!f.exists()){//判断文件是否存在
- //try{
- //f.createNewFile();//创建文件
- //}catch(IOExceptione){
- //e.printStackTrace();
- //}
- }
- /**
- *初始化UI界面
- */
- privatevoidinitializeViews(){
- tv=(TextView)findViewById(R.id.tv_result);
- btn_newTable=(Button)findViewById(R.id.newTable);
- btn_addOne=(Button)findViewById(R.id.addOne);
- btn_query=(Button)findViewById(R.id.query);
- btn_editOne=(Button)findViewById(R.id.editOne);
- btn_deleteOne=(Button)findViewById(R.id.deleteOne);
- btn_deleteTable=(Button)findViewById(R.id.deleteTable);
- btn_newTable.setOnClickListener(newClickEvent());
- btn_addOne.setOnClickListener(newClickEvent());
- btn_query.setOnClickListener( btn_editOne.setOnClickListener( btn_deleteOne.setOnClickListener( btn_deleteTable.setOnClickListener(classClickEventimplementsOnClickListener{
- voidonClick(Viewv){
- try{
- //[1]--如果是在默认的路径下创建数据库,那么实例化sqlitedb的操作如下
- sqlitedb=myOpenHelper.getWritableDatabase();
- //[2]--如果是在SD卡中创建数据库,那么实例化sqlitedb的操作如下
- //sqlitedb=SQLiteDatabase.openOrCreateDatabase(f,null);
- if(v==btn_newTable){
- StringTABLE_NAME="andy";
- StringID="id";
- StringTEXT="text";
- Stringstr_sql2="CREATETABLE"+TABLE_NAME+"("+ID
- +"INTEGERPRIMARYKEYAUTOINCREMENT,"+TEXT
- +"text);";
- sqlitedb.execSQL(str_sql2);
- tv.setText("新建数据表成功!");
- }elseif(v==btn_addOne){
- //----第1种插入数据的方法----
- //ContentValues是一个哈希表HashMap,key值是对应数据表中字段名称,
- //value值是字段的值。可以通过ContentValues的put方法把数据存放到
- //ContentValues对象中,然后把数据插入到相对应的数据表中。
- ContentValuescv=newContentValues();
- cv.put(MySQLiteOpenHelper.TEXT,"新数据");
- sqlitedb.insert(MySQLiteOpenHelper.TABLE_NAME,null,cv);
- //db.insert(Stringtable,StringnullColumnHack,ContentValuesvalues);方法解说
- //publiclonginsert(Stringtable,ContentValuesvalues)
- //该方法是向数据表中插入一条记录
- //[1]参数table:需要插入操作的表名
- //[2]参数nullColumnHack:默认null即可,若在插入一行数据时,若没有指定某列的值,
- //则默认使用null值传入。
- //[3]参数values:插入的数据
- //----第2种插入数据的方法----
- //StringINSERT_DATA=
- //"INSERTINTOandy(id,text)values(1,'第2种插入数据的方法')";
- //sqlitedb.execSQL(INSERT_DATA);
- tv.setText("添加新数据成功!");
- }if(v==btn_query){
- Cursorcur=sqlitedb.rawQuery("SELECT*FROM"+MySQLiteOpenHelper.TABLE_NAME,null);
- if(cur!=null){
- Stringtemp="";
- inti=0;
- while(cur.moveToNext()){
- temp+=cur.getString(0);
- temp+=cur.getString(1);
- i++;
- temp+="/n";
- }
- tv.setText(temp);
- if(v==btn_editOne){
- //----第1种方式修改数据----
- "更新后的数据");
- sqlitedb.update("andy",cv,"id"+"="+Integer.toString(1),153); background-color:inherit; font-weight:bold">null);
- //[1]参数table:需要操作的表名
- //[2]参数values:ContentValues
- //[3]参数whereClause:更新的条件
- //[4]参数whereArgs:更新条件对应的值
- //----第2种方式修改数据----
- //StringUPDATA_DATA=
- //"UPDATEandySETtext='通过SQL语句来修改数据'WHEREid=1";
- //sqlitedb.execSQL(UPDATA_DATA);
- tv.setText("修改数据成功!");
- if(v==btn_deleteOne){
- //----第1种方式删除数据----
- sqlitedb.delete("andy",MySQLiteOpenHelper.ID+"=1",0); background-color:inherit">//publicintdelete(Stringtable,StringwhereClause,String[]whereArgs)解说
- //[1]参数table:需要操作的表名
- //[2]参数whereClause:删除的条件
- //[3]参数whereArgs:删除条件对应的值
- //----第2种方式删除数据----
- //StringDELETE_DATA="DELETEFROMandyWHEREid=1";
- //sqlitedb.execSQL(DELETE_DATA);
- tv.setText("删除数据成功!");
- if(v==btn_deleteTable){
- sqlitedb.execSQL("DROPTABLEandy");
- tv.setText("删除数据表成功!");
- catch(Exceptione){
- tv.setText("操作失败");
- finally{
- sqlitedb.close();
- }
MySQLiteOpenHelper辅助器类代码:
copy
importandroid.content.Context;
- importandroid.database.sqlite.SQLiteOpenHelper;
- importandroid.util.Log;
- /**
- *此类继承了SQLiteOpenHelper抽象类,是一个辅助器类,需要
- *一个构造函数和重写两个方法。
- *@authorAndy
- */
- classMySQLiteOpenHelperextendsSQLiteOpenHelper{
- staticfinalStringDATABASE_NAME="AndyDemo.db";
- staticfinalintVERSION=1;
- staticfinalStringTABLE_NAME="andy";
- staticfinalStringID="id";
- staticfinalStringTEXT="text";
- publicMySQLiteOpenHelper(Contextcontext){
- super(context,DATABASE_NAME,VERSION);
- *在数据库第一次生成的时候会调用这个方法,同时我们在这个方法里边生成数据库表
- voidonCreate(SQLiteDatabasedb){
- //创建数据表的操作
- StringstrSQL="CREATETABLE"+TABLE_NAME+"("+ID
- +TEXT+"text);";
- db.execSQL(strSQL);
- *更新或者升级数据库的时候会自动调用这个方法,一般我们会在这个方法中
- *删除数据表,然后再创建新的数据表操作。
- voidonUpgrade(SQLiteDatabasedb,153); background-color:inherit; font-weight:bold">intoldVersion,153); background-color:inherit; font-weight:bold">intnewVersion){
- Log.e("AndyDemo","onUpgrade");
- }
当我们需要把数据库创建在SDCard中时,需要在AndroidManifest.xml文件中添加对SDCard操作的权限,如下:
copy
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
- <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
通过以上步骤的操作,对SQLite数据库的操作有了大概的认识。下面我们来看看程序运行的效果。
由于该Demo的代码比较多,需要该源码的请到资源中下载:http://download.csdn.net/detail/cjjky/4236087,谢谢。
欢迎大家关注 ^-^ (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|