package com.itheima.sqlitedatabase;

import java.sql.ResultSet;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper; public class MyOpenHelper extends SQLiteOpenHelper {
//安卓的数据库不是sql,oracle,用的是sqlite,是安卓内置的数据库,
//SQLiteOpenHelper是打开数据库帮助器,这是一个抽象类,要创建她的子类重写里面的方法。
public MyOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);//Activity在95%都是Context,name是数据库文件名,factory是游标工厂用于创建游标的,version是数据库的版本号,版本号是方便升级用的,版本号开始为1改为2后就会自动调用api进行升级。
} //数据库创建时,此方法会调用
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table person(_id integer primary key autoincrement, name char(10), salary char(20), phone integer(20))"); } //数据库升级version从1改到2时会调用,此方法会调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("数据库升级了");
} }
package com.itheima.sqlitedatabase.test;

import com.itheima.sqlitedatabase.MyOpenHelper;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.test.AndroidTestCase; public class TestCase extends AndroidTestCase { //AndroidTestCase类加载的时候,代码从上向下执行,执行到这行代码时此时测试框架AndroidTestCase类还没有初始化完毕,没有虚拟上下文对象
// private MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);
private MyOpenHelper oh;
private SQLiteDatabase db;
public void test(){
//getContext():获取一个虚拟的上下文,之前用的是this,这里代码不是运行在应用里面是运行在测试框架里面的,应用没有运行是没有上下文对象的,测试框架不是activity的子类,所以用getContext()获取虚礼上下文,MyOpenHelper为帮助器
MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);//CursorFactory游标工厂为null表示使用默认的工厂,版本号为1,
//如果数据库不存在,先创建数据库调用MyOpenHelper的onCreate方法,数据库在内部存储中data/data/应用名/database/people.db,再获取可读可写的数据库对象db,如果数据库存在,就直接打开
SQLiteDatabase db = oh.getWritableDatabase();//获取可读可写数据库对象
//如果存储空间满了,那么返回只读数据库对象
// SQLiteDatabase db = oh.getReadableDatabase();//获取可读可写数据库对象
} //测试框架初始化完毕之后,在测试方法(insert,test,delete右键方法名run as执行)执行之前,此方法调用
@Override
protected void setUp() throws Exception {
super.setUp(); oh = new MyOpenHelper(getContext(), "people.db", null, 1);
db = oh.getWritableDatabase();
} //测试方法执行完毕之后,此方法调用
@Override
protected void tearDown() throws Exception {
// TODO Auto-generated method stub
super.tearDown();
db.close();
} public void insert(){
//SQLite是轻量级数据库,轻量级也就牺牲了部分功能,输入的时候不检测数据格式。
oh = new MyOpenHelper(getContext(), "people.db", null, 1);
db = oh.getWritableDatabase();
// db.execSQL("insert into person (name, salary, phone)values(?, ?, ?)", new Object[]{"小志的老婆[1]", "13000", 138438});
// db.execSQL("insert into person (name, salary, phone)values(?, ?, ?)", new Object[]{"小志的儿子", 14000, "13888"});
db.execSQL("insert into person (name, salary, phone)values(?, ?, ?)", new Object[]{"小志", 14000, "13888"});//id不用插入
db.close();
} public void delete(){
db.execSQL("delete from person where name = ?", new Object[]{"小志"});
} public void update(){
db.execSQL("update person set phone = ? where name = ?", new Object[]{186666, "小志的儿子"});
} public void select(){
//execSQL没有返回值,Cursor就是结果集,null是填充占位符用的,
Cursor cursor = db.rawQuery("select name, salary from person", null); while(cursor.moveToNext()){
//通过列索引获取列的值
String name = cursor.getString(cursor.getColumnIndex("name"));
//通过序号1获取
String salary = cursor.getString(1);
System.out.println(name + ";" + salary);
}
} public void insertApi(){
//把要插入的数据全部封装至ContentValues对象
ContentValues values = new ContentValues();
values.put("name", "游天龙");
values.put("phone", "15999");
values.put("salary", 16000);
db.insert("person", null, values);
} public void deleteApi(){
int i = db.delete("person", "name = ? and _id = ?", new String[]{"小志的儿子", "3"});//返回删除了几行
System.out.println(i);
} public void updateApi(){
ContentValues values = new ContentValues();
values.put("salary", 26000);
int i = db.update("person", values, "name = ?", new String[]{"游天龙"});//后面是where条件
System.out.println(i);
} public void selectApi(){
Cursor cursor = db.query("person", null, null, null, null, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
String salary = cursor.getString(cursor.getColumnIndex("salary"));
System.out.println(name + ";" + phone + ";" + salary);
}
} public void transaction(){
try{
//开启事务
db.beginTransaction();
ContentValues values = new ContentValues();
values.put("salary", 12000);
db.update("person", values, "name = ?", new String[]{"小志"}); values.clear();
values.put("salary", 16000);
db.update("person", values, "name = ?", new String[]{"小志的儿子"}); int i = 3/0;
//设置 事务执行成功,如果这行代码没有执行就执行下面的语句则sql就回滚。
db.setTransactionSuccessful();
}
finally{
//关闭事务,同时提交(不需要commit()),如果已经设置事务执行成功,那么sql语句就生效了,反之,sql语句回滚
db.endTransaction();
}
}
}

android 69 SQLite数据库的更多相关文章

  1. android 一个SQLite数据库多个数据表的基本使用框架 (带demo)

    android 一个SQLite数据库多个数据表(带demo) 前言        demo演示        一.搭建        二.建立实体类        三.建立数据库操作类        ...

  2. Qt for Android 打包 SQLite 数据库

    Qt for Android 调用 SQLite 数据库时, 怎样将已经存在的数据库附加到 APK 中? 直接在你项目里面的Android源码的根目录下新建一个文件夹assets, 数据库就可以放里面 ...

  3. Android实现SQLite数据库联系人列表

    Android实现SQLite数据库联系人列表 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 工程内容 实现一个通讯录查看程序: 要求使用SQLite ...

  4. Android中SQLite数据库操作(1)——使用SQL语句操作SQLite数据库

    下面是最原始的方法,用SQL语句操作数据库.后面的"Android中SQLite数据库操作(2)--SQLiteOpenHelper类"将介绍一种常用的android封装操作SQL ...

  5. android中sqlite数据库的基本使用和添加多张表

    看了很多关于android使用sqlite数据库的文章,很多都是介绍了数据库的建立和表的建立,而表通常都是只建立一张,而实际情况我们用到的表可能不止一张,那这种情况下我们又该怎么办呢,好了,下面我教大 ...

  6. android 43 SQLite数据库

    SQLite数据库很小,占用内存只有几百K,安卓和IOS都是用的SQLite数据库. 页面: <LinearLayout xmlns:android="http://schemas.a ...

  7. Android中Sqlite数据库多线程并发问题

    最近在做一个Android项目, 为了改善用户体验,把原先必须让用户“等待”的过程改成在新线程中异步执行.但是这样做遇到了多个线程同时需要写Sqlite数据库,导致操作数据库失败. 本人对Java并不 ...

  8. Android之SQLite数据库篇

    一.SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大. 二.SQLite的特点 1.轻量级使用 SQLit ...

  9. Android之SQLite数据库使用

    转载整理于:http://my.csdn.net/lmj623565791 我刚开始接触Android的时候甚至都不敢相信,Android系统竟然是内置了数据库的!好吧,是我太孤陋寡闻了.由于我之前是 ...

随机推荐

  1. IOS公司开发者账号申请详细教程--1 备用

    谈到苹果开发者账号,我们需要区分一下个人账号.公司账号和企业账号这三种,还有一种是教育账号,这个就不多说了. 个人账号:个人申请用于开发苹果app所使用的账号,仅限于个人使用,申请比较容易,$99. ...

  2. Word添加新编号

    要用到(1)(2),不想手写,但是word只有1.2.3和1)2)3),我就自定义哦.

  3. Img图片超过了DIV的最大宽度 解决方案

    在该图片所在的div限定一下里边所有的图片的最大长度,这个长度的值可以是div的长度的略小即可. 例如: <div class="content" style="w ...

  4. UESTC 1425 Another LCIS

    也是一个求最长连续单调区间的问题,不同于HDU 3308LCIS的是,单点更新变成了区间成段增加,没关系同样的方法可破之.由于是成段更新,所以比更新区间小的区间是最大连续区间长度是不变的,所以更新su ...

  5. QT类库与Delphi类库的体系结构对比——两者十分类似!

    今天在看QT对象内存管理的一篇文章时:http://blog.csdn.net/dbzhang800/article/details/6300025想到了一个问题:就是QT类库体系结构与Delphi类 ...

  6. System.Windows.Forms中的Message Structure

    结构用途说明Implements a Windows message. Properties 1.public IntPtr HWnd { get; set; } Gets or sets the w ...

  7. ORACLE数字转换人民币大写

    ORACLE 数字转换人民币大写     示例.   数字                    :183066999230.68 人民币大写        :壹仟捌佰参拾亿陆仟陆佰玖拾玖万玖仟贰佰参 ...

  8. bzoj1559

    自动机上状压dp,把单词是否存在压成二进制位注意这里面某些单词会包含其他单词,所以某些自动机上有些状态点对应多个二进制位方案只要再顺着有方案的状态搜一遍即可 ..,'a'..'z'] of longi ...

  9. 1057 - Collecting Gold (状态压缩DP)

    题目大意: 给你一个矩阵,'x'是你的起始位置, 'g'是宝藏的位置,问最少多少步可以把所有的宝藏取完,并且最后返回起始位置. 注意:没有宝藏的时候输出 0   =================== ...

  10. win8 mysqlzip install

    1. 下载MySQL Community Server 5.6.142. 解压MySQL压缩包 将以下载的MySQL压缩包解压到自定义目录下.3. 添加环境变量 变量名:MYSQL_HOME 变量值: ...