SQLite数据库(sqliteexpert工具),sqlite数据库是轻量级数据库,对数据类型要求不是很严格,在数据库中处理是按verchar类型处理,一般定义表字段时还是要求严格按照数据类型定义,方便代码阅读。

  • 创建数据库

基于android.database.sqlite.SQLiteOpenHelper创建MyOpenHelper,调用SQLiteDatabase db = oh.getWritableDatabase()方法创建数据库,数据库创建后再调用此方法不会再创建数据库,数据库创建只会执行一次,除非升级数据库(系统根据版本号判断)

-----------------------------------------------------------

public class MyOpenHelper extends SQLiteOpenHelper {

public MyOpenHelper(Context context, String name, CursorFactory factory,
int version) {
//arg0:上下文
//arg1:数据库文件名
//arg2:游标工厂,游标等同于结果集,传NULL使用默认工厂
//arg3:版本号不能小于1,用于升级
super(context, name, factory, version);
}

//创建数据库时调用
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println("数据库创建");
}

//升级数据库调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("数据库升级");
}

}

------------------------------------------------------------------------------------------------

为防止在调用时写错数据库名、版本号,可以写死数据库名、版本号

public class MyOpenHelper extends SQLiteOpenHelper {

public MyOpenHelper(Context context) {//本来是四个参数,只用一个参数,其他参数不用传递
//arg0:上下文
//arg1:数据库文件名
//arg2:游标工厂,游标等同于结果集,传NULL使用默认工厂
//arg3:版本号不能小于1,用于升级
super(context, "people.db", null, 1);
}

-------------------------------------------------------------------------------------------------

public class Test extends AndroidTestCase {

public void test(){
//获取虚拟上下文
MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);
//如果数据库不存在,先创建数据库,再打开;否则直接打开数据库
SQLiteDatabase db = oh.getWritableDatabase();
}
}

-------------------------------------------------------------------------------------------------------

  • 创建表(在创建数据库时创建表)

//创建数据库时调用
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table person(_id integer primary key autoincrement,name char(10),phone char(20),salary integer(10))";
//创建表
db.execSQL(sql);
}

  • 插入数据

public class Test extends AndroidTestCase {

public void test(){
//获取虚拟上下文
MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);
//如果数据库不存在,先创建数据库,再打开;否则直接打开数据库
SQLiteDatabase db = oh.getWritableDatabase();
}

public void insert(){
MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);
SQLiteDatabase db = oh.getWritableDatabase();
//<!-- $s表示该占位符要求传入字符串,$d表示该占位符要求传入整数 -->
String sql=String.format("insert into person(name,phone,salary)values(%1$s,%2$d,%3$d)","春晓",138438,13000);
db.execSQL(sql);
//或者用如下
db.execSQL("insert into person(name,phone,salary)values(?,?,?)", new Object[]{"春晓",138438,13000});
db.close();
}
}

  • 删除、修改、查询数据(结构调整)

--------------------------------------------------------------------------------------------------------------

public class MyOpenHelper extends SQLiteOpenHelper {

public MyOpenHelper(Context context) {
//arg0:上下文
//arg1:数据库文件名
//arg2:游标工厂,游标等同于结果集,传NULL使用默认工厂
//arg3:版本号不能小于1,用于升级
super(context, "people.db", null, 1);
}

//创建数据库时调用
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table person(_id integer primary key autoincrement,name char(10),phone char(20),salary integer(10))";
//创建表
db.execSQL(sql);
}

//升级数据库调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("数据库升级");
}

}

-----------------------------------------------------------------------------------------------------------------------------------

public class Test extends AndroidTestCase {

private MyOpenHelper oh;//不能在此NEW此对象,此时测试框架还没有创建,无法提供虚拟上下文
private SQLiteDatabase db;
//测试方法执行之前先执行SETUP
@Override
protected void setUp() throws Exception {
super.setUp();
oh = new MyOpenHelper(getContext());//获取虚拟上下文
//如果数据库不存在,先创建数据库,再打开;否则直接打开数据库
db = oh.getWritableDatabase();
}

//在测试结束之后执行
@Override
protected void tearDown() throws Exception {
super.tearDown();
db.close();
}

public void insert(){
//<!-- $s表示该占位符要求传入字符串,$d表示该占位符要求传入整数 -->
String sql=String.format("insert into person(name,phone,salary)values(%1$s,%2$d,%3$d)","春晓",138438,13000);
db.execSQL(sql);
//或者用如下
db.execSQL("insert into person(name,phone,salary)values(?,?,?)", new Object[]{"春晓",138438,13000});
}

public void delete(){
db.execSQL("delete from person where name=?", new Object[]{"春晓"});
}

public void update(){
db.execSQL("update person set salary=? where name=?", new Object[]{13200,"春晓"});
}

public void select(){
Cursor cursor = db.rawQuery("select * from person", null);
//把指针移动到下一行
while(cursor.moveToNext()){
//先通过列名获取列索引,然后再获取该列的内容
String name = cursor.getString(cursor.getColumnIndex("name"));
}

}

--------------------------------------------------------------------------------------------------------

在实际数据库操作中,基本不用上述方法,而是用谷歌提供的API操作

public void insertApi(){
ContentValues values = new ContentValues();
//字段名,值
values.put("name","杨松");
values.put("phone","138888");
values.put("salary","130201");

//返回值-1,操作失败,第二个参数是values 为空时,给哪个字段插入NULL
long l=db.insert("person", null, values);
}

int i = db.delete("person", "_id=?", new String[]{"6"});

//被修改字段修改后的值
values.put("name","鲁智深");
int c = db.update("person", values, "_id=?", new String[]{"5"});

//表名,字段名(NULL表示所有字段),查询的WHERE条件,WHERE条件的占位符,分组,,排序,分页
//Cursor cursor=db.query("person", new String[]{"name","phone","salary"}, "_id=?", new String[]{"5"}, null, null, null);
Cursor cursor=db.query("person", null, null, null, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
int salary = cursor.getInt(cursor.getColumnIndex("salary"));
}

  • 数据库事务操作

public void transaction(){
try {
//开启事务
db.beginTransaction();
ContentValues values=new ContentValues();
values.put("salary", 13199);
db.update("person", values, "name=?", new String[]{"杨松"});

values.clear();
values.put("salary", 13202);
db.update("person", values, "name=?", new String[]{"春晓"});

//设置事务执行成功,提交时如果这行代码没有执行过,就会回滚
db.setTransactionSuccessful();
} finally {
//关闭事务,提交数据
db.endTransaction();
}
}

android 学习随笔四(数据库存储)的更多相关文章

  1. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览

    Android数据的四种存储方式SharedPreferences.SQLite.Content Provider和File (一) —— 总览   作为一个完成的应用程序,数据存储操作是必不可少的. ...

  2. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  3. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider

    ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制.一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制.并且此种方式忽略了底层的数据存储实现,Cont ...

  4. Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite

    SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 在SQLite中, ...

  5. [Android]Android数据的四种存储方式

    存储方式 Android提供以下四种存储方式: SharePreference SQLite File ContentProvider Android系统中数据基本都是私有的,一般存放在“data/d ...

  6. (转)Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences

    除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...

  7. [转][Android]Android数据的四种存储方式

    android.database.sqlite类 SQLiteQueryBuilder java.lang.Object android.database.sqlite.SQLiteQueryBuil ...

  8. 五、Android学习第四天补充——Android的常用控件(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 五.Android学习第四天补充——Android的常用控件 熟悉常用的A ...

  9. 四、Android学习第四天——JAVA基础回顾(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 四.Android学习第四天——JAVA基础回顾 这才学习Android的 ...

随机推荐

  1. 我的工具箱之MyEclipse9.1

    下载地址:http://pan.baidu.com/s/1bbuN1s 这个工具是用来开发Java程序,自带JDK和Tomcat,功能全面周到,使用方便. 市面上MyEclipse版本很多,但都需要破 ...

  2. oracle 循环语句

    1.基本循环(至少会执行一次) DECLARE I ; BEGIN LOOP --循环开始 DBMS_OUTPUT.PUT_LINE('VALUE:'||I); ; --退出循环条件: I:; --循 ...

  3. opencv3.0+VS2015+64位win7配置

    首先,我们把所有用到的工具下载下来 VS2015         看这里,http://news.mydrivers.com/1/439/439398.htm,我下载的是专业版. OPENCV3.0 ...

  4. Unicode 编码概念

    Unicode 编码概念 Unicode 编码可能是我们日常开发中接触最多的字符编码方式之一,其它常见的中文编码方式还包括 GB2132-80 / GB13000 / GBK / GB18030 .在 ...

  5. python_中文乱码问题

    1. 编码和解码的概念:    编码是将源对象内容按照一种标准转换为一种标准格式内容.    解码是和编码对应的,它使用和编码相同的标准将编码内容还原为最初的对象内容. 2. python中的编码和解 ...

  6. bootstrap学习之三—插件

    一.模态框(modal)插件 1)为要触发模态框的组件添加data-toggle="modal",data-target="对应ID" 2)使用一个div实现m ...

  7. MFC对话框Dialog控件处理程序handler因为public修饰符导致无法访问

    比如说你的Dialog有一个Button名为Confirm,对应IDC_CONFIRM,处理程序handler为OnConfirm 那么OnConfirm必须是protected属性,如果是publi ...

  8. 解决eclipse svn插件 的lock问题

    org.tigris.subversion.javahl.ClientException: Attemptedto lock an already-locked dir异常解决方法 myeclipse ...

  9. linux:计算机概论

    1>.计算机的五大单元:输入单元.输出单元.CPU内部的控制单元.算术逻辑判断单元和主记忆体单元(记忆体包含主记忆体和辅组记忆体): 2>.CPU分为两类:精简微指令集(RISC)和复杂微 ...

  10. leetcode143- Reorder List问题

    题目要求: Given a singly linked list L: L0→L1→…→Ln-1→Ln,    reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You m ...