利用SQLite在android上实现增删改查
利用SQLite在android上实现增删改查
方法:
一、直接利用database.execSQL()方法输入完整sql语句进行操作
这种方法适用于复杂的sql语句,比如多表查询等等
这里适合于增删改,这个方法没有返回值,而查需要返回数据,故不适用
增实例:
database.execSQL("insert into student (name,age) values ('小李',45)");
查的话用database.rawQuery()方法,也是我们直接输入完整的sql语句
查实例:
Cursor cursor = database.rawQuery("select id,name,age from student where name=?",new String[] { "小李" });
二、利用系统直接封装好的API,原理是系统内部把参数拼成sql语句
适用于简单sql语句
增: 返回操作的行
long row=database.insert("student", null, values);
删: 返回受影响的行数
int n = database.delete("student", "name=? and age=?", new String[] {"饭饭", "20" });
改: 返回受影响的行数
int n = database.update("student", values, "name=?",new String[] { "饭饭" });
查: 返回数据表游标 (注意查不是select)
Cursor cursor = database.rawQuery("select id,name,age from student where name=?",new String[] { "小李" });
三、其它
1、数据库的连接有限,所以创建连接用完要关闭
2、将我们需要操作的数据写入ContentValues
3、查数据时,游标通过cursor.moveToNext()方法来确定下一行是否有值,有值就读取下一行的值
4、得到列的索引有两种方法:
通过查找列字段对应的位置得到
int id = cursor.getInt(cursor.getColumnIndex("id"));
直接通过列号得到
String name = cursor.getString(1);
代码:
com.fry.database.MySQLiteOpenHelper
1 package com.fry.database; 2 3 import android.content.Context; 4 import android.database.sqlite.SQLiteDatabase; 5 import android.database.sqlite.SQLiteDatabase.CursorFactory; 6 import android.database.sqlite.SQLiteOpenHelper; 7 import android.util.Log; 8 9 public class MySQLiteOpenHelper extends SQLiteOpenHelper{ 10 11 /* 12 * 1、context 上下文 13 * 2、那么数据库名称 14 * 3、factory 15 * 4、version 数据库文件的版本 16 */ 17 18 public MySQLiteOpenHelper(Context context,int version) { 19 super(context, "fanfan3.db", null, version); 20 // TODO Auto-generated constructor stub 21 } 22 23 /* 数据库文件创建成功后调用 24 * (non-Javadoc) 25 * @see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase) 26 */ 27 @Override 28 public void onCreate(SQLiteDatabase db) { 29 Log.d("fanfan", "onCreate"); 30 db.execSQL("CREATE TABLE student(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,age INTEGER)"); 31 } 32 33 /* 数据库文件更新后调用 34 * (non-Javadoc) 35 * @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int) 36 */ 37 @Override 38 public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { 39 Log.d("fanfan", "onUpgrade"); 40 } 41 42 }
com.fanfan.test.Test
1 package com.fanfan.test; 2 3 import com.fry.database.MySQLiteOpenHelper; 4 5 import android.annotation.SuppressLint; 6 import android.content.ContentValues; 7 import android.database.Cursor; 8 import android.database.sqlite.SQLiteDatabase; 9 import android.test.AndroidTestCase; 10 import android.util.Log; 11 12 public class Test extends AndroidTestCase { 13 public void test1() { 14 MySQLiteOpenHelper helper = new MySQLiteOpenHelper(getContext(), 1); 15 SQLiteDatabase database = helper.getReadableDatabase(); 16 helper.getWritableDatabase(); 17 } 18 19 // 系统提供的API可以解决简单问题,但是比如多表查询的问题,系统搞不定,我们可以自己用execSQL写sql语句 20 public void insert() { 21 MySQLiteOpenHelper helper = new MySQLiteOpenHelper(getContext(), 1); 22 SQLiteDatabase database = helper.getReadableDatabase(); 23 // ContentValues values=new ContentValues(); 24 // values.put("name", "饭饭"); 25 // values.put("age", 20); 26 // long row=database.insert("student", null, values); 27 // Log.d("insert", "刚刚插入的是行的编号为: "+row); 28 // if(row==-1){ 29 // String s="插入失败"; 30 // Log.d("insert", s); 31 // } 32 // 不用系统API,自己写sql 33 database.execSQL("insert into student (name,age) values ('小李',45)"); 34 // 关闭数据库连接 35 database.close(); 36 } 37 38 public void delete() { 39 MySQLiteOpenHelper helper = new MySQLiteOpenHelper(getContext(), 1); 40 SQLiteDatabase database = helper.getReadableDatabase(); 41 // 返回受影响的行数 42 int n = database.delete("student", "name=? and age=?", new String[] { 43 "饭饭", "20" }); 44 Log.d("delete", "返回受影响的行数为: " + n); 45 // 关闭数据库连接 46 database.close(); 47 } 48 49 public void update() { 50 MySQLiteOpenHelper helper = new MySQLiteOpenHelper(getContext(), 1); 51 SQLiteDatabase database = helper.getReadableDatabase(); 52 ContentValues values = new ContentValues(); 53 values.put("name", "小红"); 54 // 返回受影响的行数 55 56 // 更改符合筛选条件的记录 57 int n = database.update("student", values, "name=?", 58 new String[] { "饭饭" }); 59 // 更改表中所有记录 60 // int n=database.update("student", values, null, null); 61 Log.d("update", "返回受影响的行数为: " + n); 62 // 关闭数据库连接 63 database.close(); 64 } 65 66 public void select() { 67 MySQLiteOpenHelper helper = new MySQLiteOpenHelper(getContext(), 1); 68 // 创建数据库连接 69 SQLiteDatabase database = helper.getReadableDatabase(); 70 /* 71 * distinct==true 剔除重复数据 table 表名 column 查询的列 selection 筛选条件 72 * selsetionArgs 指定筛选条件参数值 groupBy 分组 having 分组筛选 orderBy 排序 比如"age asc" 73 * limit 分页 74 */ 75 // select * from student where 76 // 返回的是一个结果集合 77 // Cursor cursor=database.query(true, "student", new 78 // String[]{"id","name","age"}, null, null, null, null, null, null); 79 80 // 如果多表查询,上面的方法不行,因为database.execSQL没有返回值,我们无法返回结果 81 Cursor cursor = database.rawQuery( 82 "select id,name,age from student where name=?", 83 new String[] { "小李" }); 84 85 // 下一行是否有数据 86 while (cursor.moveToNext()) { 87 // 具体得那一列的索引 88 // 通过索引得到 89 int id = cursor.getInt(cursor.getColumnIndex("id"));// id是第0列 90 // 直接通过列号得到 91 String name = cursor.getString(1); 92 int age = cursor.getInt(2); 93 String ans = "id: " + id + " name: " + name + " age: " 94 + age; 95 Log.d("select", ans); 96 } 97 // 关闭数据库连接 98 database.close(); 99 } 100 }