SQLite中的增删改查
虽然android提供了sql查询的封装方法,但是理解起来还是麻烦,所以我这里用sql语句来完成工作。
首先是建立一个类,继承SQLiteOpenHelper
这里面会建立一个数据库,并且初始化一个表。当然你可以建立多个数据库,等以后再自行建立表也可以
DatabaseHelper.java
package com.kale.sql; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class DatabaseHelper extends SQLiteOpenHelper{ private static DatabaseHelper mInstance = null; //数据库名字 public static final String DATABASE_NAME = "SQLite_db"; //版本号 private static final int DATABASE_VERSION = 1; //建立默认表的语句 private static final String CREAT_TABLE_TABLE_SQL = "create table default_table(" + "_id INTEGER PRIMARY KEY AUTOINCREMENT," + "default_string TEXT);"; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } public DatabaseHelper(Context context, String name, int version) { super(context, name, null, version); } public static synchronized DatabaseHelper getInstance(Context context) { if (mInstance == null) { mInstance = new DatabaseHelper(context); } return mInstance; } /* * 初次使用时创建数据库表 */ @Override public void onCreate(SQLiteDatabase db) { //通过sql语句建立默认表 db.execSQL(CREAT_TABLE_TABLE_SQL); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { /**可以拿到当前数据库的版本信息 与之前数据库的版本信息 如果不同,那么就更新数据库**/ } //删除数据库 public boolean deleteDatabase(Context context , String databaseName) { return context.deleteDatabase(databaseName); } }
之后再制作一个工具类,这个类主要是获得一个对象,用它来操作数据库。简单来说就是初始化一个数据库对象,然后只需sql语句
package com.kale.sql; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; public class DatabaseManager{ DatabaseHelper mDbHelper = null; //操作数据库的实例 static SQLiteDatabase mDb = null; Context mContext = null; public DatabaseManager(Context context) { mContext = context; mDbHelper = DatabaseHelper.getInstance(mContext); mDb= mDbHelper.getReadableDatabase(); } /** * 建立表 * SQLite内部只支持NULL,INTEGER,REAL(浮点),TEXT(文本),BLOB(大二进制)5种数据类型 * 建立表成功了,返回true */ public boolean executeSql(String sql){ try { mDb.execSQL(sql); return true; } catch(SQLiteException e){ return false; } } public Cursor executeSql(String sql,String[]args){ try { return mDb.rawQuery(sql, args); } catch(SQLiteException e){ e.printStackTrace(); } return null; } /** * 关闭连接 */ public void closeDBhelper() { if (mDbHelper != null) { mDbHelper.close(); } } }
最后就是使用sql语句对android中的数据库进行操作了,仍旧是经典的增删改查
package com.kale.sql; import android.app.Activity; import android.database.Cursor; import android.os.Bundle; import android.util.Log; public class MainActivity extends Activity { DatabaseManager dbManager; String tag = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); dbManager = new DatabaseManager(this); creatNewTable(); deleteOldTable(); insertData(); deleteData(); updateData(); queryData(); if (isDataExist()) { Log.i(tag, "存在这个值"); } else { Log.e(tag, "查无此值"); } } /** * 给数据库建立一个表 */ public void creatNewTable() { String createNewTable = "create table user_info(" + "_id INTEGER PRIMARY KEY AUTOINCREMENT,"+ "name TEXT,"+ "age INTEGER,"+ "height REAL,"+ "phone TEXT);"; if(dbManager.executeSql(createNewTable)) { Log.i(tag, "建表成功"); }else { Log.e(tag, "建表失败"); } } /** * 通过表名来删除一个表 */ public void deleteOldTable() { String sql = "drop table default_table"; if(dbManager.executeSql(sql)) { Log.i(tag, "删除成功"); }else { Log.e(tag, "删除失败"); } } /** * 新增数据 */ public void insertData() { String sql = "insert into user_info (name,age,height,phone) values(‘kale‘,20,180.7,‘156789564475‘)"; if(dbManager.executeSql(sql)) { Log.i(tag, "插入成功"); }else { Log.e(tag, "插入失败"); } } /** * 删除数据 */ public void deleteData() { String sql = "delete from user_info where height=180"; if(dbManager.executeSql(sql)) { Log.i(tag, "删除成功"); }else { Log.e(tag, "删除失败"); } } public void updateData() { String sql = "update user_info set name=‘tony‘ where name=‘kale‘"; if(dbManager.executeSql(sql)) { Log.i(tag, "更新成功"); }else { Log.e(tag, "更新失败"); } } /** * 查询数据,?是占位符,用于和string数组搭配使用 */ public void queryData() { String sql = "select * from user_info where name=? limit 3"; //查询name为tony的结果,当然可以用like来模糊查询了 Cursor cursor = dbManager.executeSql(sql, new String[] {"tony"}); if(cursor != null) { Log.i(tag, "查询成功,但不一定有这个数据"); while (cursor.moveToNext()) { Log.i(tag, "name = "+cursor.getString(cursor.getColumnIndex("name"))); Log.i(tag, "age = " + cursor.getString(cursor.getColumnIndex("age"))); } cursor.close(); }else { Log.e(tag, "查询失败"); } } /** * 查询数据,?是占位符,用于和string数组搭配使用 */ public boolean isDataExist() { String sql = "select * from user_info where name=?"; //查询name为tony的结果,当然可以用like来模糊查询了 Cursor cursor = dbManager.executeSql(sql, new String[] {"kale"}); if(cursor != null) { //无论查询的值是否存在,这里的cursor都不为空,只是不会进入moveToNext()方法 while (cursor.moveToNext()) { return true; } cursor.close(); } return false; } @Override protected void onDestroy() { // TODO 自动生成的方法存根 super.onDestroy(); //最后关闭helper中的SqliteDataBase dbManager.closeDBhelper(); } }
源码下载:http://download.csdn.net/detail/shark0017/7927241
辅助说明:
SQL查询语句
select * from film order by year limit 10;
select * from film order by year desc limit 10;
select count(*) from film;
select * from film where starring like ‘Jodie%‘;
select * from film where starring=‘Jodie Foster‘;
select title, year from film order by year desc limit 10;
select columns from table_name where expression;
最常见的用法,当然是倒出所有数据库的内容:
select * from film;
如果资料太多了,我们或许会想限制笔数:
select * from film limit 10;
或是照着电影年份来排列:
select * from film order by year limit 10;
或是年份比较近的电影先列出来:
select * from film order by year desc limit 10;
或是我们只想看电影名称跟年份:
select title, year from film order by year desc limit 10;
查所有茱蒂佛斯特演过的电影:
select * from film where starring=‘Jodie Foster‘;
查所有演员名字开头叫茱蒂的电影(‘%‘ 符号便是 SQL 的万用字符):
select * from film where starring like ‘Jodie%‘;
查所有演员名字以茱蒂开头、年份晚于1985年、年份晚的优先列出、最多十笔,只列出电影名称和年份:
select title, year from film where starring like ‘Jodie%‘ and year >= 1985 order by year desc limit 10;
有时候我们只想知道数据库一共有多少笔资料:
select count(*) from film;
有时候我们只想知道1985年以后的电影有几部:
select count(*) from film where year >= 1985;
(进一步的各种组合,要去看SQL专书,不过你大概已经知道SQL为什么这么流行了:这种语言允许你将各种查询条件组合在一起──而我们还没提到「跨数据库的联合查询」呢!)
如何更改或删除资料
了解select的用法非常重要,因为要在sqlite更改或删除一笔资料,也是靠同样的语法。
例如有一笔资料的名字打错了:
update film set starring=‘Jodie Foster‘ where starring=‘Jodee Foster‘;
就会把主角字段里,被打成‘Jodee Foster‘的那笔(或多笔)资料,改回成Jodie Foster。
delete from film where year < 1970;
就会删除所有年代早于1970年(不含)的电影了。
其他sqlite的特别用法
sqlite可以在shell底下直接执行命令:
sqlite3 film.db "select * from film;"
输出 HTML 表格:
sqlite3 -html film.db "select * from film;"
将数据库「倒出来」:
sqlite3 film.db ".dump" > output.sql
利用输出的资料,建立一个一模一样的数据库(加上以上指令,就是标准的SQL数据库备份了):
sqlite3 film.db < output.sql
在大量插入资料时,你可能会需要先打这个指令:
begin;
插入完资料后要记得打这个指令,资料才会写进数据库中:
commit;
参考:http://www.cnblogs.com/xFreedom/archive/2012/04/09/2439575.html
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。