分享

Android中数据存储

 leomuyi 2014-01-06

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的项目框架图: Android中数据存储--采用SQLite存储数据及在SDCard中创建数据库

通过上面的截图可以看到该项目src目录下包含两个类:MainActivity.java 和 MySQLiteOpenHelper.java 。其中MySQLiteOpenHelper.java是对数据库操作辅助类。

布局文件main.xml的代码:

01xml version="1.0" encoding="utf-8"?>
02<LinearLayout xmlns:android="http://schemas./apk/res/android"
03    android:orientation="vertical"
04    android:layout_width="fill_parent"
05    android:layout_height="fill_parent">
06    <TextView android:id="@+id/tv_title"
07       android:layout_width="fill_parent"  android:layout_height="wrap_content"
08       android:text="Hello, Welcome to Andy's blog!" android:textSize="16sp"/>
09     
10    <Button android:id="@+id/newTable" android:layout_width="fill_parent" 
11        android:layout_height="wrap_content" android:text="1.新建数据表"/> 
12    <Button android:id="@+id/addOne" android:layout_width="fill_parent" 
13        android:layout_height="wrap_content" android:text="2.插入一条记录"/> 
14    <Button android:id="@+id/query" android:layout_width="fill_parent"  
15        android:layout_height="wrap_content" android:text="3.查询数据库"/> 
16    <Button android:id="@+id/editOne" android:layout_width="fill_parent" 
17        android:layout_height="wrap_content" android:text="4.修改一条记录"/> 
18    <Button android:id="@+id/deleteOne" android:layout_width="fill_parent" 
19        android:layout_height="wrap_content" android:text="5.删除一条记录"/> 
20    <Button android:id="@+id/deleteTable" android:layout_width="fill_parent" 
21        android:layout_height="wrap_content" android:text="6.删除数据表"/> 
22         
23    <TextView android:id="@+id/tv_result"
24       android:layout_width="fill_parent"  android:layout_height="wrap_content"
25       android:text="测试显示的结果" android:textSize="16sp"/>
26     
27LinearLayout>
MainActivity.java代码:
001package com.andyidea.sqlite;
002import java.io.File;
003import java.io.IOException;
004import android.app.Activity;
005import android.content.ContentValues;
006import android.database.Cursor;
007import android.database.sqlite.SQLiteDatabase;
008import android.os.Bundle;
009import android.view.View;
010import android.view.View.OnClickListener;
011import android.widget.Button;
012import android.widget.TextView;
013import android.widget.Toast;
014public class MainActivity extends Activity {
015    private Button btn_newTable,btn_addOne,btn_query,
016            btn_editOne,btn_deleteOne,btn_deleteTable;
017    private TextView tv;
018    private MySQLiteOpenHelper myOpenHelper;
019    private SQLiteDatabase sqlitedb;
020     
021    //----以下两个成员变量是针对在SD卡中存储数据库文件使用----
022    //private File path = new File("/sdcard/dbfile"); //数据库文件目录
023    //private File f = new File("/sdcard/dbfile/AndyDemo.db"); //数据库文件
024     
025    /** Called when the activity is first created. */
026    @Override
027    public void onCreate(Bundle savedInstanceState) {
028        super.onCreate(savedInstanceState);
029        setContentView(R.layout.main);
030         
031        initializeViews();
032         
033        //实例化默认数据库辅助操作对象
034        myOpenHelper = new MySQLiteOpenHelper(this);
035         
036        //----如要在SD卡中创建数据库文件,先做如下的判断和创建相对应的目录和文件----
037        //if(!path.exists()){   //判断目录是否存在
038        //  path.mkdirs();    //创建目录
039        //}
040        //if(!f.exists()){      //判断文件是否存在
041        //  try{
042        //      f.createNewFile();  //创建文件
043        //  }catch(IOException e){
044        //      e.printStackTrace();
045        //  }
046        //}
047    }
048     
049    /**
050     * 初始化UI界面
051     */
052    private void initializeViews(){
053        tv = (TextView)findViewById(R.id.tv_result);
054        btn_newTable = (Button)findViewById(R.id.newTable);
055        btn_addOne = (Button)findViewById(R.id.addOne);
056        btn_query = (Button)findViewById(R.id.query);
057        btn_editOne = (Button)findViewById(R.id.editOne);
058        btn_deleteOne = (Button)findViewById(R.id.deleteOne);
059        btn_deleteTable = (Button)findViewById(R.id.deleteTable);
060         
061        btn_newTable.setOnClickListener(new ClickEvent());
062        btn_addOne.setOnClickListener(new ClickEvent());
063        btn_query.setOnClickListener(new ClickEvent());
064        btn_editOne.setOnClickListener(new ClickEvent());
065        btn_deleteOne.setOnClickListener(new ClickEvent());
066        btn_deleteTable.setOnClickListener(new ClickEvent());
067    }
068     
069    class ClickEvent implements OnClickListener{
070        @Override
071        public void onClick(View v) {
072            try{
073                //[1]--如果是在默认的路径下创建数据库,那么实例化sqlitedb的操作如下
074                sqlitedb = myOpenHelper.getWritableDatabase(); //实例化数据库
075                 
076                //[2]--如果是在SD卡中创建数据库,那么实例化sqlitedb的操作如下
077                //sqlitedb = SQLiteDatabase.openOrCreateDatabase(f, null);
078                 
079                if(v == btn_newTable){   //1.新建数据表
080                    String TABLE_NAME = "andy";
081                    String ID = "id";
082                    String TEXT = "text";
083                    String str_sql2 = "CREATE TABLE " + TABLE_NAME + "(" + ID 
084                        + " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT 
085                        + " text );";
086                    sqlitedb.execSQL(str_sql2);
087                    tv.setText("新建数据表成功!");
088                     
089                }else if(v == btn_addOne){  //2.插入一条记录
090                    //----第1种插入数据的方法----
091                    //ContentValues是一个哈希表HashMap,key值是对应数据表中字段名称,
092                    //value值是字段的值。可以通过ContentValues的put方法把数据存放到
093                    //ContentValues对象中,然后把数据插入到相对应的数据表中。
094                    ContentValues cv = new ContentValues();
095                    cv.put(MySQLiteOpenHelper.TEXT, "新数据");
096                    sqlitedb.insert(MySQLiteOpenHelper.TABLE_NAME, null, cv);
097                    //db.insert(String table, String nullColumnHack, ContentValues values);方法解说
098                    //public long insert (String table, String nullColumnHack, ContentValues values)
099                    //该方法是向数据表中插入一条记录
100                    //[1]参数table:需要插入操作的表名
101                    //[2]参数nullColumnHack:默认null即可,若在插入一行数据时,若没有指定某列的值,
102                    //   则默认使用null值传入。
103                    //[3]参数values:插入的数据
104                     
105                    //----第2种插入数据的方法----
106                    // String INSERT_DATA = 
107                    // "INSERT INTO andy (id,text) values (1, '第2种插入数据的方法')"; 
108                    // sqlitedb.execSQL(INSERT_DATA);
109                     
110                    tv.setText("添加新数据成功!");
111                     
112                }else if(v == btn_query){   //3.查询数据库
113                    Cursor cur = sqlitedb.rawQuery("SELECT * FROM "+MySQLiteOpenHelper.TABLE_NAME, null);
114                    if(cur != null){
115                        String temp = "";
116                        int i = 0;
117                        while(cur.moveToNext()){
118                            temp += cur.getString(0);  //0代表数据列的第一列,即id
119                            temp += cur.getString(1);  //1代表数据列的第二列,即text
120                            i++;
121                            temp += "/n";    //定义显示数据的格式,一行一个数据
122                        }
123                        tv.setText(temp);
124                         
125                    }
126                }else if(v == btn_editOne){  //4.修改一条记录
127                    //----第1种方式修改数据----
128                    ContentValues cv = new ContentValues();
129                    cv.put(MySQLiteOpenHelper.TEXT, "更新后的数据");
130                    sqlitedb.update("andy", cv, "id " + "=" + Integer.toString(1), null);
131                    //[1]参数table:需要操作的表名
132                    //[2]参数values:ContentValues
133                    //[3]参数whereClause:更新的条件
134                    //[4]参数whereArgs:更新条件对应的值
135                     
136                    //----第2种方式修改数据----
137                    // String UPDATA_DATA = 
138                    // "UPDATE andy SET text='通过SQL语句来修改数据'  WHERE id=1"; 
139                    // sqlitedb.execSQL(UPDATA_DATA); 
140                    tv.setText("修改数据成功!");
141                     
142                }else if(v == btn_deleteOne){  //5.删除一条记录
143                    //----第1种方式删除数据----
144                    sqlitedb.delete("andy", MySQLiteOpenHelper.ID + "= 1", null);
145                    //public int delete(String table, String whereClause, String[] whereArgs)解说
146                    //[1]参数table:需要操作的表名
147                    //[2]参数whereClause:删除的条件
148                    //[3]参数whereArgs:删除条件对应的值
149                     
150                    //----第2种方式删除数据----
151                    //String DELETE_DATA = "DELETE FROM andy WHERE id=1";
152                    //sqlitedb.execSQL(DELETE_DATA);
153                    tv.setText("删除数据成功!");
154                     
155                }else if(v == btn_deleteTable){  //6.删除数据表
156                    sqlitedb.execSQL("DROP TABLE andy");
157                    tv.setText("删除数据表成功!");
158                     
159                }
160            }catch(Exception e){
161                tv.setText("操作失败");
162            }finally{
163                sqlitedb.close();
164            }
165        }
166         
167    }
168}
MySQLiteOpenHelper辅助器类代码:
01package com.andyidea.sqlite;
02import android.content.Context;
03import android.database.sqlite.SQLiteDatabase;
04import android.database.sqlite.SQLiteOpenHelper;
05import android.util.Log;
06/**
07 * 此类继承了SQLiteOpenHelper抽象类,是一个辅助器类,需要
08 * 一个构造函数和重写两个方法。
09 * @author Andy
10 */
11public class MySQLiteOpenHelper extends SQLiteOpenHelper {
12    public static final String DATABASE_NAME = "AndyDemo.db"; //数据库名
13    public static final int VERSION = 1;   //版本号
14    public static final String TABLE_NAME = "andy"//表名
15    public static final String ID = "id";
16    public static final String TEXT = "text";
17     
18    public MySQLiteOpenHelper(Context context) {
19        super(context, DATABASE_NAME, null, VERSION);
20    }
21    /**
22     * 在数据库第一次生成的时候会调用这个方法,同时我们在这个方法里边生成数据库表
23     */
24    @Override
25    public void onCreate(SQLiteDatabase db) {
26        //创建数据表的操作
27        String strSQL = "CREATE TABLE " + TABLE_NAME + "(" + ID 
28        + " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT + " text );"
29         
30        db.execSQL(strSQL);
31    }
32    /**
33     * 更新或者升级数据库的时候会自动调用这个方法,一般我们会在这个方法中
34     * 删除数据表,然后再创建新的数据表操作。
35     */
36    @Override
37    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
38        Log.e("AndyDemo", "onUpgrade"); 
39    }
40}
当我们需要把数据库创建在SDCard中时,需要在AndroidManifest.xml文件中添加对SDCard操作的权限,如下:
1<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> 
2<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

通过以上步骤的操作,对SQLite数据库的操作有了大概的认识。下面我们来看看程序运行的效果。

Android中数据存储--采用SQLite存储数据及在SDCard中创建数据库

由于该Demo的代码比较多,需要该源码的可以发邮件给我索取。邮箱:Chenjunjun.ZJ@gmail.com

欢迎大家关注 ^-^

文章出处:http://blog.csdn.net/cjjky/article/details/6578393

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多