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,这是为了方便后面使用 SimpleCursorAdapter 向 ListView 列表填充数据。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 }
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 }
主界面布局文件
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>
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>
添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

浙公网安备 33010602011771号