虽然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

辅助说明:

cursor重要方法:

close()   关闭游标,释放资源

copyStringToBuffer(int columnIndex, CharArrayBuffer buffer)     在缓冲区中检索请求的列的文本,将将其存储

getColumnCount()    返回所有列的总数

getColumnIndex(String columnName)    返回指定列的名称,如果不存在返回-1

getColumnIndexOrThrow(String columnName)    从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。

getColumnName(int columnIndex)     从给定的索引返回列名

getColumnNames()    返回一个字符串数组的列名

getCount()    返回Cursor 中的行数

moveToFirst()    移动光标到第一行

moveToLast()   移动光标到最后一行

moveToNext()   移动光标到下一行

moveToPosition(int position)   移动光标到一个绝对的位置

moveToPrevious()   移动光标到上一行

 

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

SQLite中的增删改查的更多相关文章

  1. 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查

    原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...

  2. Android中Sqlite数据库进行增删改查

    今天这篇文章写Sqlite数据库,通过一个小案例来完整讲一下数据库常见的CRUD操作. 先对知识点总结: SQLite数据库 轻量级关系型数据库 创建数据库需要使用的api:SQLiteOpenHel ...

  3. android 对sqlite数据库的增删改查等各种操作

    转载:http://blog.csdn.net/vrix/article/details/6717090 package com.sqlite.main; import java.io.File; i ...

  4. Android下利用SQLite数据库实现增删改查

    1: 首先介绍如何利用adb查看数据库 1: adb shell 2: cd /data/data/包名/databases 3:  sqlite3 数据库 4   接下来就可以进行数据库的sql语法 ...

  5. Android对Sqlite数据库的增删改查

    SqLite 数据库 Google 为我们提供了sqlite相关的api SqLiteOpenHelper 这是一个抽象的类 如果想要使用的话,需要其他的类去继承他 SqLiteDatabase 类 ...

  6. [Android] SQLite数据库之增删改查基础操作

        在编程中常常会遇到数据库的操作,而Android系统内置了SQLite,它是一款轻型数据库,遵守事务ACID的关系型数据库管理系统,它占用的资源非常低,可以支持Windows/Linux/Un ...

  7. winform窗体(六)——DataGridView控件及通过此控件中实现增删改查

    DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定:    List<xxx> list = new List<xxx> ...

  8. Winform(DataGridView)控件及通过此控件中实现增删改查

    DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定:    List<xxx> list = new List<xxx> ...

  9. greendao对SQLite数据库的增删改查操作

    利用greendao操作数据库时,都是以对象或者对象的list来进行增删改查的操作,操作的结果都是用一个list来接收的!!! 1.增加一条记录 Stu stu01=new Stu();stu01.s ...

随机推荐

  1. 【LOJ】#2107. 「JLOI2015」城池攻占

    题解 用一个平衡树维护能攻占到u点的骑士,合并到父亲的时候去掉攻击力小于父亲生命值的那部分,只要把那棵树拆掉并且将树中的所有骑士更新一下答案,用无旋式treap很好写 合并的时候只要启发式合并就可以了 ...

  2. Java基础常见英语词汇(共70个)

    ——————————ASP.Net+Android+IOS开发..Net培训.期待与您交流!—————————— Java英文单词 OO: object—oriented ,面向对象 OOP:obje ...

  3. shiro双realm验证

    假设现在有这样一种需求:存在两张表user和admin,分别记录普通用户和管理员的信息.并且现在要实现普通用户和管理员的分开登录,即需要两个Realm——UserRealm和AdminRealm,分别 ...

  4. 【BZOJ 1180】 (LCT)

    1180: [CROATIAN2009]OTOCI Time Limit: 50 Sec  Memory Limit: 162 MBSubmit: 1078  Solved: 662 Descript ...

  5. 深入理解指针—>指针函数与函数指针的区别

    一. 在学习过程中发现这"指针函数"与"函数指针"容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义: 1.指针函数是指带指针的函数, ...

  6. STL中map的遍历

    map作为STL中的映射容器非常好用,我们来说一下map的遍历. map.first为key值,map.second为value值,key不可修改,value可修改. 定义一个迭代指针iter,使其指 ...

  7. phpexcel一个bug

    大家好! 我想我发现了这个bug. 如果我从文件中图像删除,它加载正常. 如果有图像时候,何时$ objPHPExcel = PHPExcel_IOFactory :: load($ file);我得 ...

  8. 研究table-cell和overflow

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. [原创]Linux下网络性能测试Netperf工具介绍及安装

    [原创]Linux下网络性能测试Netperf工具介绍及安装 1 官方网站 http://www.netperf.org/netperf/ 2 Netperf介绍 Netperf是一种网络性能的测试工 ...

  10. 使用Java进行串口SerialPort通讯

    1.准备工作        在进行串口连接通讯前,必须保证你当前操作电脑上有可用且闲置的串口.因为一般的电脑上只有一个或者两个串口,如COM1或COM2,但大多数情况下,这些串口可能会被其他的程序或者 ...