android-数据库SQLite相关
android平台下的SQLite数据库是一种轻量级数据库,支持标准的SQL语句。
本文将介绍
- android数据库的创建
- 利用sql语句对数据库增删改查
- 系统api数据库增删改查
- 数据库的事务
- 1,数据库的创建
步骤:
- 写一个类继承SQLiteOpenHelper
- 在构造函数中指定 数据库名称,游标工厂, 版本号
- 初始化数据库,执行getWritableDatabase或getReadableDatabase, 创建或打开一个数据库.
onCreate里执行SQL创建语句
android平台下数据库的创建需要一个辅助类继承SQLiteOpenHelper,并且需要重写父类的构造方法。
/**
* 数据库创建辅助类 写一个类继承SQLiteOpenHelper
*
* @author wgk
*
*/
public class PersonSQLiteOpenHelper extends SQLiteOpenHelper { public PersonSQLiteOpenHelper(Context context) {
super(context, "PERSON.db", null, 1);//此处是super,直接调用父类的构造方法
} /**
*
* 构造方法,用于创建一个辅助类,用于打开/创建/管理一个数据库
*
* @param context
* 上下文
* @param name
* 数据库文件的名字
* @param factory
* 游标工厂 Cursor 游标(指针), 本身并不存储数据. 保存数据库的引用.
* @param version
* 数据库版本
*/
public PersonSQLiteOpenHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
} @Override
// 数据库第一次被创建时调用,适合初始化操作
public void onCreate(SQLiteDatabase db) {
// 创建表
db.execSQL("create table person ("
+ " _id integer primary key autoincrement, "
+ " name varchar(20), " + " age integer);");
} @Override
// 数据库更新时调用这个方法
// 用于执行表的更新操作
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub } }这个类仅仅是一个辅助类,若想使用数据库,还需要创建一个数据库访问类PersonDAO。
2,对数据库进行增删改查
public class PersonDAO{ private final Context context;
private PersonSQLiteOpenHelper helper; public PersonDAO(Context context) {
this.context = context;
helper = new PersonSQLiteOpenHelper(context);
} /**
* @param name
* @param age
*/
public void add(String name, int age) {
SQLiteDatabase db = helper.getWritableDatabase();
// db.execSQL("insert into person (name,age) values ('"+name+"',"+age+")");
// 防止SQL注入
db.execSQL("insert into person (name,values) values(?,?)",
new Object[] { name, age });
} /**
* 根据名字删除一条数据
*
* @param name
*/
public void delete(String name) {
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("delete from person where name=?", new Object[] { name });
} //根据名字更新年龄public void update(int age, String name) {
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("update person set age=? where name=?", new Object[] { age,name });
} public void querySingleRecord(String nameStr) {
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from person where name=?",new String[] { nameStr }); if (cursor != null && cursor.moveToFirst()) {
String _id = cursor.getString(0);
String name = cursor.getString(1);
String age = cursor.getString(2);
System.out.println("_id: " + _id);
System.out.println("name: " + name);
System.out.println("age: " + age);
cursor.close();
}
} /**
* 查询所有数据
*/
public void queryAll() {
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.rawQuery("select * form person", null); if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
int _id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
System.out.println("_id: " + _id);
System.out.println("name: " + name);
System.out.println("age: " + age);
System.out.println("-----------------");
}
cursor.close();
}
} }注意:在获得数据库辅助类对象时,此时并未创建数据库,只有在辅助类对象调用getxxxxDatabase方法(创建可读或者可写的数据库)时,才创建数据库。
//此时并未创建数据可
PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext());
// 获取一个可读/可写的数据库, 真正创建了数据库
helper.getWritableDatabase();3,使用goole的api操作数据库
除了使用SQL语句来进行增删改查,还可以使用google提供的api。
//主要语句
// 增
db.insert("person", "name", values); // 删
db.delete("person", "name=?", new String[]{name}); // 改
db.update("person", values, "name=?", new String[]{name}); //查
Cursor cursor = db.query("person", // 表名
null, // 要查询列名 new String[]{name,age}
"name = ?", // 查询条件
new String[]{nameStr},// 条件参数
null, // 分组
null, // 分组
null); // 排序使用google的api对PersonDAO进行修改,如下
/**
* 使用google提供的api来操作数据库
*
* 数据库访问对象
* @author wgk
*
*/
public class PersonDAO3 { private final Context context;
private PersonSQLiteOpenHelper helper;
public PersonDAO3(Context context){
this.context=context;
helper=new PersonSQLiteOpenHelper(context);
}
/**
* 增加一条数据
* @param name
* @param age
*/
public void add(String name,int age){
SQLiteDatabase db=helper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("name", name);
values.put("age", age); //若需要插入一条空的数据,需要指定任意一个列的名称,以避免异常
String nullColumnHack="null";
long insert=db.insert("person", nullColumnHack, values);
System.out.println(insert);
}
/**
* 删除一条数据根据名字
* @param name
*/
public void delete(String name){
SQLiteDatabase db=helper.getWritableDatabase();
int delete=db.delete("person", "name=?", new String[]{name});
System.out.println(delete);
}
/**
* 更新年龄!根据名字
* @param age
* @param name
*/
public void update(int age,String name){
SQLiteDatabase db=helper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("age", age);
int update =db.update("person", values, "name=?", new String[]{name});
System.out.println(update);
} /**
* 查!根据一个人的名字
* @param name
*/
public void querySingleRecord(String nameStr){
SQLiteDatabase db=helper.getReadableDatabase();
Cursor cursor=db.query("person",
null,//列名
"name=?",//查询条件
new String[]{nameStr},//查询参数
null, //分组
null,//分组
null);//排序
if(cursor!=null&&cursor.moveToFirst()){
String _id=cursor.getString(0);
String name=cursor.getString(1);
String age=cursor.getString(2);
System.out.println("_id: " + _id);
System.out.println("name: " + name);
System.out.println("age: " + age); //关闭cursor
//关闭cursor
//关闭cursor
cursor.close();
} }
/**
* 查询所有数据
*/
public void queryAll(){
SQLiteDatabase db=helper.getReadableDatabase();
Cursor cursor=db.query("person",
null,
null,
null,
null,
null,
"_id DESC");//排序
if(cursor!=null&&cursor.getCount()>0){
while(cursor.moveToNext()){
int _id=cursor.getInt(cursor.getColumnIndex("_id"));
String name=cursor.getString(cursor.getColumnIndex("name"));
int age=cursor.getInt(cursor.getColumnIndex("age")); System.out.println("_id: " + _id);
System.out.println("name: " + name);
System.out.println("age: " + age);}
//关闭cursor
//关闭cursor
//关闭cursor
cursor.close();
}
}
}两种方式的比较
1.利用SQL语句进行增删改查
优点:灵活, 根据需要进行表的级联查询.缺点:容易出错. 没有返回值
2.利用系统API增删改查
优点:不容易出错. 有返回值
缺点:不灵活, 效率稍低, 拼接sql语句耗时
-------------------------------------------------我是分割线-------------------------------------------------
数据库的事务(Transaction)
(安全性)银行转账:
- 转出,laowang 账户10000 -> 转出1000 ->
- 转入,xiaosan 账户 0 收到1000
(高效性)数据的插入:
- 提高数据库操作效率, 大约提升6倍速度
- 打开一次数据,
以laowang给xiaosan转账1000的例子写一段demo如下
public class TransactionDemo extends AndroidTestCase{ public void transactionDemo(){ PersonSQLiteOpenHelper helper= new PersonSQLiteOpenHelper(getContext());
//此时才真正创建数据库
SQLiteDatabase db=helper.getWritableDatabase();
try{
//开始事务
db.beginTransaction(); //转出1000
db.execSQL("update person set money=money-1000 where name=?", new Object[]{"laowang"}); //在执行至回滚点之前,并不会对数据库进行真的操作,一切都在内存中进行,只有执行到回滚点之后,才会影响到数据库
//int i =1/0;
//转入1000
db.execSQL("update person set money=money+1000 where name=?", new Object[]{"xiaosan"});
//设置回滚点
db.setTransactionSuccessful();
}catch (Exception e){
e.printStackTrace();
}finally{
db.endTransaction(); }
}总结:
-------------------------------------------------基础要像磐石!!!
android-数据库SQLite相关的更多相关文章
- android数据库SQLite的设计模式
Dao设计模式可能是使用最多的数据库的设计模式其基本思路是将数据库操作的代码 与设计代码分离以便于维护和升级.具体的实现方法是使用包,然后在设计代码中调 用数据库的操作代码,dao设计模式需要创建5个 ...
- Android 数据库SQLite 写入SD卡
如果手机没有root,数据库文件是无法查看到的,不方便调试. 最好的办法是把数据库写进SD卡. 修改的地方有两处: 1.在你的helper类中把数据库文件名称 DATABASE_NAME 由原来的一个 ...
- Android数据库(sqlite)加密方案
最近因为一些项目的安全性需要将数据库加密,一开始想到的就是先将数据库通过AES加密,然后运行时再解密,另一种是将数据库里的内容加密. 很快这两种方案都是不理想的,第一种加密方式形同虚设,第二种,如果加 ...
- android数据库sqlite增加删改查
http://hi-beijing.iteye.com/blog/1322040 http://www.cnblogs.com/wenjiang/archive/2013/05/28/3100860. ...
- Android下的SQLite数据库的相关操作及AndroidTestCase测试
一:创建数据库 package com.itcode.mysqlite; import android.content.Context; import android.database.sqlite. ...
- Android中SQLite数据库小计
2016-03-16 Android数据库支持 本文节选并翻译<Enterprise Android - Programing Android Database Applications for ...
- Android数据库高手秘籍(一)——SQLite命令
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/38461239 要想熟练地操作不论什么一个数据库.最最主要的要求就是要懂SQL语言, ...
- Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite
Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射 ...
- Android:自定义Sqlite数据库路径
默认的sqlite数据库是放在/data/data/database目录下的,今天看腾讯云IM的demo发现再该路径下找不到它存放消息的数据库,找了下后发现居然是放在/data/data/files目 ...
- Android数据库(1)、SQLite数据库介绍
一.关系性数据库 关系型数据库主要有以下三个特征,尤为明显,如果没有这个三个特征约束,当多个客户端使用数据的时候就会出现各种各样的错误,所以关系型数据库定义这些约束,让客户端程序只要遵守这个规则便 ...
随机推荐
- OSSIM 4 组件目录
在查找openvas问题的时候,发现: 主要组件的配置文件目录:/etc/default主要组件的安装目录:/usr/share 感觉和kali linux的的结构类似.
- 【cocos2d-js官方文档】十一、cc.path
概述 该单例是为了方便开发者操作文件路径所设计的.定义为cc.path的目的是为了跟nodejs的path保持一致.里面定义的api也基本跟nodejs的path模块一致,但不全有,今后可能还会继续根 ...
- python的垃圾回收机制和析构函数__del__
析构函数__del__定义:在类里定义,如果不定义,Python 会在后台提供默认析构函数. 析构函数__del__调用: A.使用del 显式的调用析构函数删除对象时:del对象名: class F ...
- HDU 2988.Dark roads-最小生成树(Kruskal)
最小生成树: 中文名 最小生成树 外文名 Minimum Spanning Tree,MST 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的 ...
- Hive知识
HIVEQL CREATE DATABASE financials(创建数据库) SHOW DATABASES(显示数据库) SHOW TABLES IN 数据库(列出数据库的所有表) SHOW DA ...
- Codeforces #442 Div2 E
#442 Div2 E 题意 给你一棵树,每个结点有开关(0表示关闭,1表示开启),两种操作: 反转一棵子树所有开关 询问一棵子树有多少开关是开着的 分析 先 DFS 把树上的结点映射到区间上,然后就 ...
- 02、Mecanim之IK动画
序言:IK动画全名是Inverse Kinematics 意思是逆向动力学,就是子骨骼节点带动父骨骼节点运动. 比如体操运动员,只靠手来带动身体各个部位的移动.手就是子骨骼,身体就是它的父骨骼,这时运 ...
- 【kmp算法】poj2406 Power Strings
如果next[n]<n/2,一定无解. 否则,必须要满足n mod (n-next[n]) = 0 才行,此时,由于next数组的性质,0~n-next[n]-1的部分一定是最小循环节. [ab ...
- 【最大流】【Dinic】bzoj2929 [Poi1999]洞穴攀行
TMD 题意其实是与1或n相连的边只能走一次,其他可以走无限次……翻译去死. 裸最大流. #include<cstdio> #include<cstring> #include ...
- [CF468D]Tree
[CF468D]Tree 题目大意: 一棵\(n(n\le10^5)\)个编号为\(1\sim n\)的点的带边权的树,求一个排列\(p_{1\sim n}\),使\(\sum dis(i,p_i ...