android 学习随笔四(数据库存储)
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 学习随笔四(数据库存储)的更多相关文章
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
Android数据的四种存储方式SharedPreferences.SQLite.Content Provider和File (一) —— 总览 作为一个完成的应用程序,数据存储操作是必不可少的. ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences
除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (四) —— ContentProvider
ContentProvider是安卓平台中,在不同应用程序之间实现数据共享的一种机制.一个应用程序如果需要让别的程序可以操作自己的数据,即可采用这种机制.并且此种方式忽略了底层的数据存储实现,Cont ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (二) —— SQLite
SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大数据 在SQLite中, ...
- [Android]Android数据的四种存储方式
存储方式 Android提供以下四种存储方式: SharePreference SQLite File ContentProvider Android系统中数据基本都是私有的,一般存放在“data/d ...
- (转)Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (三) —— SharePreferences
除了SQLite数据库外,SharedPreferences也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息.其存储位置在/data ...
- [转][Android]Android数据的四种存储方式
android.database.sqlite类 SQLiteQueryBuilder java.lang.Object android.database.sqlite.SQLiteQueryBuil ...
- 五、Android学习第四天补充——Android的常用控件(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 五.Android学习第四天补充——Android的常用控件 熟悉常用的A ...
- 四、Android学习第四天——JAVA基础回顾(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 四.Android学习第四天——JAVA基础回顾 这才学习Android的 ...
随机推荐
- imx6 lvds 代码分析
查看imx6 kernel中lvds设备和驱动的初始化过程. 相关文档: arm/arm/mach-mx6/board-mx6q_sabresd.c kernel/drivers/video/mxc/ ...
- SwipeRefreshLayout实现上拉加载下拉刷新
package com.example.swiperefreshlayoutdemo; import java.util.ArrayList;import java.util.HashMap; imp ...
- Android --账户注销
参考博客:android如何实现注销功能 Intent logoutIntent=new Intent(SettingActivity.this,LoginActivity.class); //在执行 ...
- Jboss消息 异常
org.jboss.mq.SpyJMSException: Could not update message: 1 msg=13 hard STORED PERSISTENT queue=QUEUE. ...
- nsstring打印结构体
// // main.m // 09-常用结构体 // // Created by apple on 14-3-20. // Copyright (c) 2014年 apple. All ri ...
- Windows下MongoDB安装与PHP扩展
MongoDB是什么就不再累述了,下面只写MongoDB安装与PHP扩展的方法. 一,安装准备 MongoDB 如果网速慢,可以到MongoDB中文社区的百度网盘下载,密码3gun.(根据你的操作系统 ...
- MAX(A,B)
MAX(A,B) 可以把x,或者y的变量扔进去比较,会自动放出比较结果,这样就避免的三目运算.
- CheckBox的用法
if (window.pageConfig["IsCommend"] == "True") { $("#IsCommend").v ...
- Groupon面经Prepare: Max Cycle Length
题目是遇到偶数/2,遇到奇数 *3 + 1的题目,然后找一个range内所有数字的max cycle length.对于一个数字,比如说44,按照题目的公式不停计算,过程是 44, 22, 11, 8 ...
- Leetcode: Word Pattern II
Given a pattern and a string str, find if str follows the same pattern. Here follow means a full mat ...