现在的位置: 首页 > 综合 > 正文

SQLite数据库简单的认识

2013年12月03日 ⁄ 综合 ⁄ 共 9971字 ⁄ 字号 评论关闭

 

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的代码:

01 <?xml
version="1.0"
encoding="utf-8"?>
02 <LinearLayout
xmlns:android="http://schemas.android.com/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       
27 </LinearLayout>

MainActivity.java代码:

001 package com.andyidea.sqlite;
002 import java.io.File;
003 import java.io.IOException;
004 import android.app.Activity;
005 import android.content.ContentValues;
006 import android.database.Cursor;
007 import android.database.sqlite.SQLiteDatabase;
008 import android.os.Bundle;
009 import android.view.View;
010 import android.view.View.OnClickListener;
011 import android.widget.Button;
012 import android.widget.TextView;
013 import android.widget.Toast;
014 public
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辅助器类代码:

01 package
com.andyidea.sqlite;
02 import
android.content.Context;
03 import
android.database.sqlite.SQLiteDatabase;
04 import
android.database.sqlite.SQLiteOpenHelper;
05 import
android.util.Log;
06 /**
07  * 此类继承了SQLiteOpenHelper抽象类,是一个辅助器类,需要 
08  * 一个构造函数和重写两个方法。
09  * @author Andy
10  */
11 public
class
MySQLiteOpenHelper

抱歉!评论已关闭.