SQLite数据库的基本操作
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2015年已经有15个年头,SQLite也迎来了一个版本 SQLite 3已经发布。
下面简单介绍其在安卓中的应用:
1.首先自己写一个类MyOpenHelper继承SQLiteOpenHelper,SQLiteOpenHelper是抽象类,需要重写构造方法和实现两个方法。如下:
package com.example.sqlite; 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 { /**
* 重写构造方法,因为父类没有无参构造方法
* @param context
* @param name
* @param factory
* @param version
*/
public MyOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
} /**
* 数据库创建时,此方法会调用
*/
@Override
public void onCreate(SQLiteDatabase db) {
System.out.println("数据库被创建了");
db.execSQL("create table person(_id integer primary key autoincrement," +
" name varchar(10), salary varchar(20), phone integer(20))");
} /**
* 数据库升级时,此方法被调用
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
System.out.println("数据库升级了");
} }
2.在测试类中进行测试,增删改查,下面演示第一种,自己写SQL语句:
package com.example.sqlite.test; import com.example.sqlite.MyOpenHelper; import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.test.AndroidTestCase; public class TestCase extends AndroidTestCase { private MyOpenHelper oh;
private SQLiteDatabase db; /**
* 测试创建数据库
* 即使运行两遍,也只会创建一次数据库
*/
public void test1(){
MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);
//如果数据库不存在,先创建数据库,再获取可读可写的数据库对象,如果数据库存在,就直接打开
SQLiteDatabase db = oh.getWritableDatabase();
//返回的和上面的没区别,除非内部存储空间满了,返回只读数据库
//SQLiteDatabase db = oh.getReadableDatabase();
} /**
* 测试框架初始完毕之后,在测试方法执行之前,此方法调用
*/
@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 {
super.tearDown();
db.close();
} /**
* 测试插入
*/
public void test2(){
db.execSQL("insert into person(name, salary, phone) values(?,?,?)",
new Object[]{"陈驰","15000",151762});
} /**
* 测试删除
*/
public void test3(){
db.execSQL("delete from person where name=?", new Object[]{"陈驰"});
} /**
* 测试更新
*/
public void test4(){
db.execSQL("update person set phone=? where name=?",new Object[]{123456, "陈驰"});
} /**
* 测试查询
*/
public void test5(){
//注意,API变了,第二个参数是sql语句中?的填充
Cursor cursor = db.rawQuery("select name, salary from person", null);
while(cursor.moveToNext()){
//通过列索引获取列的值
String name = cursor.getString(cursor.getColumnIndex("name"));
String salary = cursor.getString(cursor.getColumnIndex("salary"));
System.out.println(name+",,,"+salary);
}
} }
3.在测试类中进行测试,增删改查,下面演示第二种,调用API:
public void insertApi(){
//把要插入的数据全部封装至ContentValues对象
ContentValues values = new ContentValues();
values.put("name", "陈掣");
values.put("salary", "16000");
values.put("phone", 15176290645L);
//返回的是最新插入的主键值(表名,填写null就行<只有在values为空才有用>,插入的内容)
long id = db.insert("person", null, values);
System.out.println(id);
}
public void deleteApi(){
//返回的是删除的行数(表名,条件,条件中?的填充)
int rows = db.delete("person", "name=? and _id=?", new String[]{"陈驰", "10"});
System.out.println(rows);
}
public void updateApi(){
ContentValues values = new ContentValues();
values.put("salary", "777777");
//返回的是受影响的行数(表名,更改的内容,条件,条件中?的填充)
int rows = db.update("person", values, "_id=?", new String[]{"7"});
System.out.println(rows);
}
public void selectApi(){
//(表名,查询字段<null为所有字段>,查询条件,查询条件中?的填充,groupby,having,orderby,limit)
Cursor cursor = db.query("person", null, "name=?", new String[]{"陈掣"},
null, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String salary = cursor.getString(cursor.getColumnIndex("salary"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
System.out.println(name+","+salary+","+phone);
}
}
以上就是简单的增删改查操作,可以下载一个SQLite Expert可视化工具进行查看。
4.事务管理,模拟一个转账的例子
public void transaction(){
try {
//开启事务
db.beginTransaction();
ContentValues values = new ContentValues();
values.put("salary", "19000");
db.update("person", values, "_id=?", new String[]{"11"});
values.clear();
values.put("salary", "13000");
db.update("person", values, "_id=?", new String[]{"12"});
//int i = 2/0; //如果在这里抛异常,则设置事务执行成功的代码不会执行,sql语句回滚,update不生效
//设置事务执行成功
db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭事务,同时提交,如果已经设置事务执行成功,那么sql语句就生效了,反之,sql语句回滚
db.endTransaction();
}
}
SQLite数据库的基本操作的更多相关文章
- iOS: sqlite数据库的基本操作
介绍: sqlite3(3是版本)是本地系统中的一个小型数据库,因为它没有在数据维护和安全上做过多的操作,所以它存储处理数据时,非常简单方便,但是它是不安全和不可靠的,如果一旦误操作删除了数据,是没有 ...
- android SQLite数据库的基本操作
SQLite是Android使用的轻量级的数据库,开发Android应用是对数据库的操作自然是必不可少. Android提供了一个SQLiteOpenHelper类来可以很方便的操作数据库, 继承和扩 ...
- windows phone 8.1开发SQlite数据库操作详解
原文出自:http://www.bcmeng.com/windows-phone-sqlite1/ 本文小梦将和大家分享WP8.1中SQlite数据库的基本操作:(最后有整个示例的源码)(希望能通过本 ...
- android 一个SQLite数据库多个数据表的基本使用框架 (带demo)
android 一个SQLite数据库多个数据表(带demo) 前言 demo演示 一.搭建 二.建立实体类 三.建立数据库操作类 ...
- SQLite数据库基本操作
SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. 其特点是高度便携.使用方便.结构紧凑.高效.可靠. 与其他数据库管理系统不同,SQLite 的安装和运行非 ...
- 基于.NET C#的 sqlite 数据库 ORM 【Easyliter】
因为工作原因经常用到SQLITE数据库,但又找不到好用的ORM所以自个整理了一个简单好用的轻量极ORM框架:Easyliter 功能介绍: 1.支持SQL语句操作 2.支持 List<T> ...
- 2014-08-01 ASP.NET中对SQLite数据库的操作——ADO.NET
今天是在吾索实习的第18天.我主要学习了如何在ASP.NET中对SQLite数据库的操作,其基本操作如下: 添加引用System.Data.SQLite.dll(PS:在网页里面任意找到适合的.NET ...
- IOS开发-UI学习-sqlite数据库的操作
IOS开发-UI学习-sqlite数据库的操作 sqlite是一个轻量级的数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了,而且它的处理速度比Mysql.PostgreSQL这 ...
- Android数据存储引擎---SQLite数据库
目标:是否可以在PC端桌面上使用SQLite数据库制作一个财务文件? 目录: 来源: 实践: 总结和比较: SQLite数据简介 是什么,内部结构是怎样的,数据库和表的关系是什么 有什么用 常用的操作 ...
随机推荐
- 链剖&LCT总结
在搞LCT之前,我们不妨再看看喜闻乐见的树链剖分. 树链剖分有一道喜闻乐见的例题:NOI2015 软件包管理器 如果你看懂题目了,你就会明白它是叫你维护一个树,这棵树是不会动的,要兹磁子树求和,子树修 ...
- Centos下Apache使用Symlink访问外部目录出现403
在Aapche 的document root 下创建软链到其他目录时, 无法从浏览器访问, 返回403错误. 主要检查两点: 1. 软链目标目录的每一级, 都要对所有人开放执行权限, 即对各级目录 c ...
- PAT 1018. 锤子剪刀布 (20)
现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入第1行给出正整数N(<=105),即双方交锋的次数.随后N行,每行给出一次交锋的信息,即 ...
- winform程序重启
winform程序重启的方法: private void ReStart() { string processName = System.Diagnostics.Process.GetCurrentP ...
- python里的del变量无法立刻释放内存的解决办法
最近在python开发的时候,用到了一些很占用内存的操作,导致后续程序执行很慢甚至无法执行.探索了一下,最终解决了这个问题. 截图解释: python变量占用了内存,仅仅通过del变量的方式,只是让这 ...
- DEDECMS之三 首页、列表页怎么调用文章内容
一.首页调用 百度了很多,没有找到实际的解决方法,对于直接读取数据库,这种写法不会采取. 后来,仔细考虑,这部分解决的内容不会很多,所以直接使用了简介的内容 方法一(默认长度55) [field:in ...
- web—第四章css&第五章
web—第四章css&第五章 终于迎接等待已久的CSS,在没学这个之前,我们只会用一点img,查一点小图片,或者是用style改一下颜色,而且比较麻烦.现在多了个css在文件夹在创建一个cs ...
- c++基础 explicit
c++的构造函数也定义了一个隐式转换 explicit只对构造函数起作用,用来抑制隐式转换 看一个小例子 新建一个头文件 #ifndef CMYSTRING_H #define CMYSTRING_H ...
- web 前端常用组件【05】ZTree
web 项目或多或少都会有涉及到什么人员职称树,菜单树,组织机构树等. 历手三四个项目有大有小,采用的树前端都是 Ztree. 有些优秀的J2EE 框架将这些常用的组件都封装起来,作为模块化的组件提供 ...
- sublime 函数跳转插件 — ctags 安装和使用
ctags 是 sublime 下一个函数跳转的插件,可以让你方便地从函数调用的位置跳到函数定义的位置.相对于其他插件,ctags 的安装稍微有点复杂,这里记录下备忘. 首先,假设已经安装 Packa ...