SQLite 数据库读写操作类

SQLite 数据库是一款轻量级的关键型数据库,实际上就是一个db 文件,但支持 SQL 语句。Android 系统提供了丰富的 API 用于操作 SQLite 数据库。

SQLiteDatabase 类用于 android.database.sqlite 包中,提供了一个静态方法,用于得到 SQLiteDatabase 对象,对 SQLite 数据库进行创建删除执行 SQL 语句等操作。

常用的静态方法有:

1、openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags);

2、openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags);

3、openOrCreateDatabase(File file, SQLiteDatabase.CursorFactory factory);

SQLiteDatabase 类似于 JDBC 编程中的 Connection、Statement 和 PreparedStatement 的组合。

SQLiteDatabase 类常用方法

1、long  insert(String table, String nullColumn Hack, ContentValue value);

2、int  delete(String table, String whereClause, String[] whereArgs);

3、int  update(String table, ContentValues values, String whereClause, String[] whereArgs);

4、Cursor  query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);

5、Cursor  query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy);

6、void  execSQL(String sql);

7、void  execSQL(String sql, Object[] bindArgs);

8、void  beginTransaction();

9、void  endTransaction();

10、void  close();

ContentValues 位于 android.content 包中,实际上相当于一个 Map 集合,提供 put 和 get 操作,用于存放键值对。其中,键就是表中的一个字段,值就是该字段对应的内容。

Cursor 是一个接口,位于 android.content 包中,功能类似于 JDBC 中的 ResultSet,主要用于查询结果集

Cursor 常用操作

1、int  getCount();

2、int  getColumnCount();

3、boolean  isFirst();

4、boolean  isLast();

5、boolean  moveToFirst();

6、boolean  moveToLast();

7、boolean  move(int  offset);

8、boolean  moveToNext();

9、boolean  moveToPrevious();

10、int  getColumnIndex(String columnName);

11、String  getColumnName(int columnIndex);

12、String[]  getColumnName();

 例:

创建数据库、新建表

在创建表字段时,主键为 _id,这是为了方便后面使用 SimpleCursorAdapterListView 列表填充数据。SimpleCursorAdapter 填充数据时,要求其主键必须为 _id,否则抛出异常。

  1 import java.io.File;
  2 import java.io.IOException;
  3 
  4 import android.os.Bundle;
  5 import android.os.Environment;
  6 import android.app.Activity;
  7 import android.content.ContentValues;
  8 import android.database.Cursor;
  9 import android.database.SQLException;
 10 import android.database.sqlite.SQLiteDatabase;
 11 import android.util.Log;
 12 import android.view.Menu;
 13 import android.view.View;
 14 import android.view.View.OnClickListener;
 15 import android.widget.Button;
 16 import android.widget.CursorAdapter;
 17 import android.widget.EditText;
 18 import android.widget.ListView;
 19 import android.widget.SimpleCursorAdapter;
 20 /**
 21  * 该类只做 SQLiteDatabase 基本操作的演示,并无严格的逻辑验证
 22  * */
 23 public class MainActivity extends Activity implements OnClickListener{
 24     
 25     EditText et1,et2,et3,et4,et5,et6;
 26     Button b1,b2,b3,b4;
 27     ListView lv;
 28     SQLiteDatabase sdb;    // 数据库
 29     
 30     @Override
 31     protected void onCreate(Bundle savedInstanceState) {
 32         super.onCreate(savedInstanceState);
 33     
 34         setContentView(R.layout.activity_main);
 35         et1 = (EditText) findViewById(R.id.editText1);
 36         et2 = (EditText) findViewById(R.id.editText2);
 37         et3 = (EditText) findViewById(R.id.editText3);
 38         et4 = (EditText) findViewById(R.id.editText4);
 39         et5 = (EditText) findViewById(R.id.editText5);
 40         et6 = (EditText) findViewById(R.id.editText6);
 41         b1 = (Button) findViewById(R.id.button1);
 42         b2 = (Button) findViewById(R.id.button2);
 43         b3 = (Button) findViewById(R.id.button3);
 44         b4 = (Button) findViewById(R.id.button4);
 45         b1.setOnClickListener(this);
 46         b2.setOnClickListener(this);
 47         b3.setOnClickListener(this);
 48         b4.setOnClickListener(this);
 49         lv = (ListView) findViewById(R.id.listView1);
 50         // 创建数据库
 51         getDb("/database", "booksdb.db");
 52         // 创建表
 53         createTable("tb_books");
 54         // 通过 MySQLiteOpenHelper 创建数据库
 55         /* sdb = new MySQLiteOpenHelper(this,Environment.getExternalStorageDirectory().getAbsolutePath()+
 56                                  File.separator+"ndb.db3",null,1).getWritableDatabase();
 57                                  */
 58     }
 59     
 60     @Override
 61     public void onClick(View v) {
 62         
 63         switch(v.getId()){
 64         case R.id.button1:
 65             insertData();
 66             break;
 67         case R.id.button2:    
 68             updateData();
 69             break;
 70         case R.id.button3:
 71             deleteData();
 72             break;
 73         case R.id.button4:
 74             queryData();
 75             break;
 76             
 77         }
 78         // 将数据显示在 ListView 列表中
 79         showData();
 80     }
 81     
 82     // 数据适配器向 ListView 填充数据
 83     private void showData() {
 84         
 85         Cursor c = queryData();
 86         CursorAdapter ca = new SimpleCursorAdapter(
 87                 this, 
 88                 R.layout.listview_item, 
 89                 c, 
 90                 new String[]{"_id",    "bookname", "bookprice"}, 
 91                 new int[]{R.id.listview_item_id, R.id.listview_item_name, R.id.listview_item_price}, 
 92                 CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER
 93                 );
 94         
 95         lv.setAdapter(ca);
 96     }
 97     
 98     // 创建数据库
 99     public SQLiteDatabase getDb(String dbPath, String dbName){
100         
101         File dbDir = new File(Environment.getExternalStorageDirectory(), dbPath);
102         if(!dbDir.exists()){
103             dbDir.mkdirs();
104         }
105         
106         File dbFile = new File(dbDir, dbName);
107         try {
108             if(!dbFile.exists()){
109                 dbFile.createNewFile();
110             }
111             sdb = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
112         } catch (IOException e) {
113             e.printStackTrace();
114         }
115         return sdb;
116     }
117     
118     // 创建数据库表
119     public void createTable(String tbName){
120         String sql = "create table " + 
121                 tbName +
122                 "(" + "_id integer primary key autoincrement," +
123                 "bookname varchar, bookprice float)";
124         
125         try {
126             // 同名的 table 只能存在一个,如果重复一定会出异常
127             sdb.execSQL(sql);
128         } catch (Exception e) {
129             Log.i("Tag", "该表已存在!");
130             //e.printStackTrace();
131         }
132     }
133     
134     // 插入数据
135     public void insertData(){
136         
137         String bName = et1.getText().toString();
138         String bPrice = et2.getText().toString();
139         // 创建  ContentValues,存放数据
140         ContentValues cv = new ContentValues();
141         cv.put("bookname", bName);
142         cv.put("bookprice", bPrice);
143         long r = sdb.insert("tb_books", null,cv);
144         Log.i("Tag", "插入数据成功 ID="+r);
145     }
146     
147     // 根据 ID 更新数据
148     public void updateData(){
149         
150         String id = et3.getText().toString();
151         String bPrice = et4.getText().toString();
152         if(id.length()<1) return;
153         ContentValues cv = new ContentValues();
154         cv.put("bookprice", bPrice);
155         long r = sdb.update("tb_books", cv, "_id=?", new String[]{id});
156         Log.i("Tag", "更新数据成功 ID = " + r);
157     }
158     
159     // 根据 ID 删除数据
160     public void deleteData(){
161         
162         String id = et5.getText().toString();
163         if(id.length()<1) return;
164         int r = sdb.delete("tb_books", "_id=?", new String[]{id});
165         Log.i("Tag", "删除数据成功 ID = " + r);
166     }
167     
168     // 根据 ID 查询数据,如果 ID 为 null,则查询全部数据
169     public Cursor queryData(){
170         
171         String id = et6.getText().toString();
172         Cursor c = null;
173         if(id.length()<1){
174             c = sdb.query("tb_books", new String[]{"_id", "bookname", "bookprice"},
175                     null,null,null, null,null);
176         }else{
177             c = sdb.query("tb_books", new String[]{"_id", "bookname", "bookprice"},
178                     "_id=?", new String[]{id}, null, null,null);
179         }
180         return c;
181     } 
182     
183     @Override
184     protected void onDestroy() {
185         // TODO Auto-generated method stub
186         super.onDestroy();
187         if(sdb != null){
188             sdb.close();
189             sdb = null;
190         }
191     }
192 }
MainActivty.java

SQLiteOpenHelper 类位于 android.database.sqlite 包中,是一个抽象类,它作为 SQLiteDatabase 类的一个帮助类,用来管理数据库的创建和版本的更新。MySQLiteOpenHelper 类继承并实现它的 onCreate 和 onUpgrade 方法。

当通过 get 方法获取 SQLiteDatabase 数据库时,如果所指定的数据库不存在,则需要创建该数据库,执行 onCreate 方法,当所指定的数据库存在时,直接返回该数据库。

onUpgrade 方法用于更新数据库,更新数据库的标志是数据库的版本 version,该参数由程序自行控制,但创建 SQLiteOpenHelper 时传入的参数 version 大于 以前的版本,onUpgrade 方法便会执行,因此可以在该方法中处理软件升级时对数据库结构的更改操作。

 1 import android.content.Context;
 2 import android.database.DatabaseErrorHandler;
 3 import android.database.sqlite.SQLiteDatabase;
 4 import android.database.sqlite.SQLiteDatabase.CursorFactory;
 5 import android.database.sqlite.SQLiteOpenHelper;
 6 import android.util.Log;
 7 
 8 public class MySQLiteOpenHelper extends SQLiteOpenHelper {
 9     
10     public MySQLiteOpenHelper(Context context, String name,
11             CursorFactory factory, int version,
12             DatabaseErrorHandler errorHandler) {
13         super(context, name, factory, version, errorHandler);
14     }
15     
16     public MySQLiteOpenHelper(Context context, String name,
17             CursorFactory factory, int version) {
18         super(context, name, factory, version);
19     }
20     
21     @Override
22     public void onCreate(SQLiteDatabase sdb) {
23         Log.i("Tag", "onCrate执行,创建表");
24         // 新建表 tb_books
25         String sql = "create table tb_books(" +
26         "_id integer primary key autoincrement," +
27         "bookname varchar,bookprice float,authorID integer)";
28         sdb.execSQL(sql);
29         // 新建表 tb_authors
30         sql = "create table tb_authors(" +
31         "_id integer primary key autoincrement," +
32         "authorname varchar,authorphone varchar)";
33         sdb.execSQL(sql);
34     }
35     
36     @Override
37     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
38         Log.i("Tag", "SQLiteDatabase upgrade "+oldVersion +" > "+newVersion);
39     }
40 }
MySQLiteOpenHelper.java

主界面布局文件

  1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2     xmlns:tools="http://schemas.android.com/tools"
  3     android:layout_width="match_parent"
  4     android:layout_height="match_parent"
  5     android:orientation="vertical"
  6     tools:context=".MainActivity" >
  7 
  8     <LinearLayout
  9         android:layout_width="fill_parent"
 10         android:layout_height="wrap_content" >
 11 
 12         <TextView
 13             android:id="@+id/textView1"
 14             android:layout_width="wrap_content"
 15             android:layout_height="wrap_content"
 16             android:text="书名:" />
 17 
 18         <EditText
 19             android:id="@+id/editText1"
 20             android:layout_weight="1.0"
 21             android:layout_width="wrap_content"
 22             android:layout_height="wrap_content" >
 23         </EditText>
 24 
 25         <TextView
 26             android:id="@+id/textView2"
 27             android:layout_width="wrap_content"
 28             android:layout_height="wrap_content"
 29             android:text="价格:" />
 30 
 31         <EditText
 32             android:id="@+id/editText2"
 33              android:layout_weight="1.0"
 34             android:layout_width="wrap_content"
 35             android:layout_height="wrap_content" />
 36 
 37         <Button
 38             android:id="@+id/button1"
 39             android:layout_width="wrap_content"
 40             android:layout_height="wrap_content"
 41             android:text="添加" />
 42     </LinearLayout>
 43 
 44     <LinearLayout
 45         android:layout_width="match_parent"
 46         android:layout_height="wrap_content" >
 47 
 48         <TextView
 49             android:id="@+id/textView3"
 50             android:layout_width="wrap_content"
 51             android:layout_height="wrap_content"
 52             android:text="ID:" />
 53 
 54         <EditText
 55             android:id="@+id/editText3"
 56             android:layout_width="wrap_content"
 57             android:layout_height="wrap_content"
 58             android:layout_weight="1"
 59             android:ems="10" />
 60 
 61         <TextView
 62             android:id="@+id/textView4"
 63             android:layout_width="wrap_content"
 64             android:layout_height="wrap_content"
 65             android:text="价格:" />
 66 
 67         <EditText
 68             android:id="@+id/editText4"
 69             android:layout_width="wrap_content"
 70             android:layout_height="wrap_content"
 71             android:layout_weight="1"
 72             android:ems="10" />
 73 
 74         <Button
 75             android:id="@+id/button2"
 76             android:layout_width="wrap_content"
 77             android:layout_height="wrap_content"
 78             android:text="更新" />
 79 
 80     </LinearLayout>
 81 
 82     <LinearLayout
 83         android:layout_width="match_parent"
 84         android:layout_height="wrap_content" >
 85 
 86         <TextView
 87             android:id="@+id/textView5"
 88             android:layout_width="wrap_content"
 89             android:layout_height="wrap_content"
 90             android:text="ID:" />
 91 
 92         <EditText
 93             android:id="@+id/editText5"
 94             android:layout_width="wrap_content"
 95             android:layout_height="wrap_content"
 96             android:layout_weight="1"
 97             android:ems="10" />
 98 
 99         <Button
100             android:id="@+id/button3"
101             android:layout_width="wrap_content"
102             android:layout_height="wrap_content"
103             android:text="删除" />
104 
105     </LinearLayout>
106 
107     <LinearLayout
108         android:layout_width="match_parent"
109         android:layout_height="wrap_content" >
110 
111         <TextView
112             android:id="@+id/textView6"
113             android:layout_width="wrap_content"
114             android:layout_height="wrap_content"
115             android:text="ID:" />
116 
117         <EditText
118             android:id="@+id/editText6"
119             android:layout_width="wrap_content"
120             android:layout_height="wrap_content"
121             android:layout_weight="1"
122             android:ems="10" />
123 
124         <Button
125             android:id="@+id/button4"
126             android:layout_width="wrap_content"
127             android:layout_height="wrap_content"
128             android:text="查询" />
129 
130     </LinearLayout>
131 
132     <ListView
133         android:id="@+id/listView1"
134         android:layout_width="match_parent"
135         android:layout_height="wrap_content" >
136     </ListView>
137 
138 </LinearLayout>
activity_main.xml

ListView 布局文件

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="fill_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="horizontal" >
 6 
 7     <TextView
 8         android:id="@+id/listview_item_id"
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         android:paddingLeft="8dp"
12         android:paddingRight="8dp"
13         android:text="TextView" />
14 
15     <TextView
16         android:id="@+id/listview_item_name"
17         android:layout_width="wrap_content"
18         android:layout_height="wrap_content"
19         android:text="Large Text"
20         android:layout_weight="1.0"
21         android:textAppearance="?android:attr/textAppearanceLarge" />
22 
23     <TextView
24         android:id="@+id/listview_item_price"
25         android:layout_width="wrap_content"
26         android:layout_height="wrap_content"
27         android:paddingRight="8dp"
28         android:text="Medium Text"
29         android:textAppearance="?android:attr/textAppearanceMedium" />
30 
31 </LinearLayout>
listview_item.xml

添加权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

posted @ 2015-05-25 16:00  壬子木  阅读(662)  评论(0)    收藏  举报