你的位置:首页 > 操作系统

[操作系统]利用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、factory15   * 4、version 数据库文件的版本16  */17 18  public MySQLiteOpenHelper(Context context,int version) {19   super(context, "fanfan3.db", null, version);20   // TODO Auto-generated constructor stub21  }22 23  /* 数据库文件创建成功后调用24   * (non-Javadoc)25   * @see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase)26  */27  @Override28  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  @Override38  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 }
JUnit 测试增删改查