SQLite中的增删改查
虽然android提供了sql查询的封装方法,但是理解起来还是麻烦,所以我这里用sql语句来完成工作。
首先是建立一个类,继承SQLiteOpenHelper
这里面会建立一个数据库,并且初始化一个表。当然你可以建立多个数据库,等以后再自行建立表也可以
DatabaseHelper.java
- package com.kale.sql;
- import android.content.Context;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteOpenHelper;
- public class DatabaseHelper extends SQLiteOpenHelper{
- private static DatabaseHelper mInstance = null;
- //数据库名字
- public static final String DATABASE_NAME = "SQLite_db";
- //版本号
- private static final int DATABASE_VERSION = 1;
- //建立默认表的语句
- private static final String CREAT_TABLE_TABLE_SQL = "create table default_table("
- + "_id INTEGER PRIMARY KEY AUTOINCREMENT," + "default_string TEXT);";
- public DatabaseHelper(Context context) {
- super(context, DATABASE_NAME, null, DATABASE_VERSION);
- }
- public DatabaseHelper(Context context, String name, int version) {
- super(context, name, null, version);
- }
- public static synchronized DatabaseHelper getInstance(Context context) {
- if (mInstance == null) {
- mInstance = new DatabaseHelper(context);
- }
- return mInstance;
- }
- /*
- * 初次使用时创建数据库表
- */
- @Override
- public void onCreate(SQLiteDatabase db) {
- //通过sql语句建立默认表
- db.execSQL(CREAT_TABLE_TABLE_SQL);
- }
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- /**可以拿到当前数据库的版本信息 与之前数据库的版本信息 如果不同,那么就更新数据库**/
- }
- //删除数据库
- public boolean deleteDatabase(Context context , String databaseName) {
- return context.deleteDatabase(databaseName);
- }
- }
之后再制作一个工具类,这个类主要是获得一个对象,用它来操作数据库。简单来说就是初始化一个数据库对象,然后只需sql语句
- package com.kale.sql;
- import android.content.Context;
- import android.database.Cursor;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteException;
- public class DatabaseManager{
- DatabaseHelper mDbHelper = null;
- //操作数据库的实例
- static SQLiteDatabase mDb = null;
- Context mContext = null;
- public DatabaseManager(Context context) {
- mContext = context;
- mDbHelper = DatabaseHelper.getInstance(mContext);
- mDb= mDbHelper.getReadableDatabase();
- }
- /**
- * 建立表
- * SQLite内部只支持NULL,INTEGER,REAL(浮点),TEXT(文本),BLOB(大二进制)5种数据类型
- * 建立表成功了,返回true
- */
- public boolean executeSql(String sql){
- try {
- mDb.execSQL(sql);
- return true;
- }
- catch(SQLiteException e){
- return false;
- }
- }
- public Cursor executeSql(String sql,String[]args){
- try {
- return mDb.rawQuery(sql, args);
- }
- catch(SQLiteException e){
- e.printStackTrace();
- }
- return null;
- }
- /**
- * 关闭连接
- */
- public void closeDBhelper() {
- if (mDbHelper != null) {
- mDbHelper.close();
- }
- }
- }
最后就是使用sql语句对android中的数据库进行操作了,仍旧是经典的增删改查
- package com.kale.sql;
- import android.app.Activity;
- import android.database.Cursor;
- import android.os.Bundle;
- import android.util.Log;
- public class MainActivity extends Activity {
- DatabaseManager dbManager;
- String tag = "MainActivity";
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- dbManager = new DatabaseManager(this);
- creatNewTable();
- deleteOldTable();
- insertData();
- deleteData();
- updateData();
- queryData();
- if (isDataExist()) {
- Log.i(tag, "存在这个值");
- }
- else {
- Log.e(tag, "查无此值");
- }
- }
- /**
- * 给数据库建立一个表
- */
- public void creatNewTable() {
- String createNewTable = "create table user_info(" +
- "_id INTEGER PRIMARY KEY AUTOINCREMENT,"+
- "name TEXT,"+
- "age INTEGER,"+
- "height REAL,"+
- "phone TEXT);";
- if(dbManager.executeSql(createNewTable)) {
- Log.i(tag, "建表成功");
- }else {
- Log.e(tag, "建表失败");
- }
- }
- /**
- * 通过表名来删除一个表
- */
- public void deleteOldTable() {
- String sql = "drop table default_table";
- if(dbManager.executeSql(sql)) {
- Log.i(tag, "删除成功");
- }else {
- Log.e(tag, "删除失败");
- }
- }
- /**
- * 新增数据
- */
- public void insertData() {
- String sql = "insert into user_info (name,age,height,phone) values('kale',20,180.7,'156789564475')";
- if(dbManager.executeSql(sql)) {
- Log.i(tag, "插入成功");
- }else {
- Log.e(tag, "插入失败");
- }
- }
- /**
- * 删除数据
- */
- public void deleteData() {
- String sql = "delete from user_info where height=180";
- if(dbManager.executeSql(sql)) {
- Log.i(tag, "删除成功");
- }else {
- Log.e(tag, "删除失败");
- }
- }
- public void updateData() {
- String sql = "update user_info set name='tony' where name='kale'";
- if(dbManager.executeSql(sql)) {
- Log.i(tag, "更新成功");
- }else {
- Log.e(tag, "更新失败");
- }
- }
- /**
- * 查询数据,?是占位符,用于和string数组搭配使用
- */
- public void queryData() {
- String sql = "select * from user_info where name=? limit 3";
- //查询name为tony的结果,当然可以用like来模糊查询了
- Cursor cursor = dbManager.executeSql(sql, new String[] {"tony"});
- if(cursor != null) {
- Log.i(tag, "查询成功,但不一定有这个数据");
- while (cursor.moveToNext()) {
- Log.i(tag, "name = "+cursor.getString(cursor.getColumnIndex("name")));
- Log.i(tag, "age = " + cursor.getString(cursor.getColumnIndex("age")));
- }
- cursor.close();
- }else {
- Log.e(tag, "查询失败");
- }
- }
- /**
- * 查询数据,?是占位符,用于和string数组搭配使用
- */
- public boolean isDataExist() {
- String sql = "select * from user_info where name=?";
- //查询name为tony的结果,当然可以用like来模糊查询了
- Cursor cursor = dbManager.executeSql(sql, new String[] {"kale"});
- if(cursor != null) {
- //无论查询的值是否存在,这里的cursor都不为空,只是不会进入moveToNext()方法
- while (cursor.moveToNext()) {
- return true;
- }
- cursor.close();
- }
- return false;
- }
- @Override
- protected void onDestroy() {
- // TODO 自动生成的方法存根
- super.onDestroy();
- //最后关闭helper中的SqliteDataBase
- dbManager.closeDBhelper();
- }
- }
源码下载:http://download.csdn.net/detail/shark0017/7927241
辅助说明:
cursor重要方法:
close() 关闭游标,释放资源
copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) 在缓冲区中检索请求的列的文本,将将其存储
getColumnCount() 返回所有列的总数
getColumnIndex(String columnName) 返回指定列的名称,如果不存在返回-1
getColumnIndexOrThrow(String columnName) 从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。
getColumnName(int columnIndex) 从给定的索引返回列名
getColumnNames() 返回一个字符串数组的列名
getCount() 返回Cursor 中的行数
moveToFirst() 移动光标到第一行
moveToLast() 移动光标到最后一行
moveToNext() 移动光标到下一行
moveToPosition(int position) 移动光标到一个绝对的位置
moveToPrevious() 移动光标到上一行
SQL查询语句
select * from film order by year limit 10;
select * from film order by year desc limit 10;
select count(*) from film;
select * from film where starring like 'Jodie%';
select * from film where starring='Jodie Foster';
select title, year from film order by year desc limit 10;
select columns from table_name where expression;
最常见的用法,当然是倒出所有数据库的内容:
select * from film;
如果资料太多了,我们或许会想限制笔数:
select * from film limit 10;
或是照着电影年份来排列:
select * from film order by year limit 10;
或是年份比较近的电影先列出来:
select * from film order by year desc limit 10;
或是我们只想看电影名称跟年份:
select title, year from film order by year desc limit 10;
查所有茱蒂佛斯特演过的电影:
select * from film where starring='Jodie Foster';
查所有演员名字开头叫茱蒂的电影('%' 符号便是 SQL 的万用字符):
select * from film where starring like 'Jodie%';
查所有演员名字以茱蒂开头、年份晚于1985年、年份晚的优先列出、最多十笔,只列出电影名称和年份:
select title, year from film where starring like 'Jodie%' and year >= 1985 order by year desc limit 10;
有时候我们只想知道数据库一共有多少笔资料:
select count(*) from film;
有时候我们只想知道1985年以后的电影有几部:
select count(*) from film where year >= 1985;
(进一步的各种组合,要去看SQL专书,不过你大概已经知道SQL为什么这么流行了:这种语言允许你将各种查询条件组合在一起──而我们还没提到「跨数据库的联合查询」呢!)
如何更改或删除资料
了解select的用法非常重要,因为要在sqlite更改或删除一笔资料,也是靠同样的语法。
例如有一笔资料的名字打错了:
update film set starring='Jodie Foster' where starring='Jodee Foster';
就会把主角字段里,被打成'Jodee Foster'的那笔(或多笔)资料,改回成Jodie Foster。
delete from film where year < 1970;
就会删除所有年代早于1970年(不含)的电影了。
其他sqlite的特别用法
sqlite可以在shell底下直接执行命令:
sqlite3 film.db "select * from film;"
输出 HTML 表格:
sqlite3 -html film.db "select * from film;"
将数据库「倒出来」:
sqlite3 film.db ".dump" > output.sql
利用输出的资料,建立一个一模一样的数据库(加上以上指令,就是标准的SQL数据库备份了):
sqlite3 film.db < output.sql
在大量插入资料时,你可能会需要先打这个指令:
begin;
插入完资料后要记得打这个指令,资料才会写进数据库中:
commit;
参考:http://www.cnblogs.com/xFreedom/archive/2012/04/09/2439575.html
SQLite中的增删改查的更多相关文章
- 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查
原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...
- Android中Sqlite数据库进行增删改查
今天这篇文章写Sqlite数据库,通过一个小案例来完整讲一下数据库常见的CRUD操作. 先对知识点总结: SQLite数据库 轻量级关系型数据库 创建数据库需要使用的api:SQLiteOpenHel ...
- android 对sqlite数据库的增删改查等各种操作
转载:http://blog.csdn.net/vrix/article/details/6717090 package com.sqlite.main; import java.io.File; i ...
- Android下利用SQLite数据库实现增删改查
1: 首先介绍如何利用adb查看数据库 1: adb shell 2: cd /data/data/包名/databases 3: sqlite3 数据库 4 接下来就可以进行数据库的sql语法 ...
- Android对Sqlite数据库的增删改查
SqLite 数据库 Google 为我们提供了sqlite相关的api SqLiteOpenHelper 这是一个抽象的类 如果想要使用的话,需要其他的类去继承他 SqLiteDatabase 类 ...
- [Android] SQLite数据库之增删改查基础操作
在编程中常常会遇到数据库的操作,而Android系统内置了SQLite,它是一款轻型数据库,遵守事务ACID的关系型数据库管理系统,它占用的资源非常低,可以支持Windows/Linux/Un ...
- winform窗体(六)——DataGridView控件及通过此控件中实现增删改查
DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定: List<xxx> list = new List<xxx> ...
- Winform(DataGridView)控件及通过此控件中实现增删改查
DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定: List<xxx> list = new List<xxx> ...
- greendao对SQLite数据库的增删改查操作
利用greendao操作数据库时,都是以对象或者对象的list来进行增删改查的操作,操作的结果都是用一个list来接收的!!! 1.增加一条记录 Stu stu01=new Stu();stu01.s ...
随机推荐
- 关于Ocelot 网关结合Consul实现服务转发的坑爹问题
下面是我的网关配置来验证下Ocelot的问题,如果只是做网关转发应该还ok,但是要是结合Consul来检查并健康的转发有效服务器还是有很多弊端 关键在于通过设置 DeregisterCriticalS ...
- vue-element-table-js去重合并单元格解析【实战需求】
有数据如下: { '2019-01-23': [ { 'channel': 'zp', 'listScanListNum': 24, 'listParseOkNum': 0, 'listPersonM ...
- SpringBoot中使用纯scala进行开发 配置教程 非常简单的案例
新建项目 建好之后 建一个叫scala的文件夹 并把它标记为root文件夹 修改pom.xml文件 复制粘贴如下内容: 添加的插件的作用,如果不添加,在新建文件的时候右键只能新建java的文件,无法创 ...
- 查询物理表字段(mysql)
SELECT t.COLUMN_NAME AS NAME, ( CASE WHEN t.IS_NULLABLE = 'YES' THEN '1' ELSE '0' END ) AS ISNULL, ( ...
- AngularJS过滤器filter入门
在开发中,经常会遇到这样的场景 如用户的性别分为“男”和“女”,在数据库中保存的值为1和0,用户在查看自己的性别时后端返回的值自然是1或0,前端要转换为“男”或“女”再显示出来: 如我要换个羽毛球拍, ...
- 第二届i春秋挖洞大赛的一些感想
挖洞比赛嘛,根据规则就是一个问题,如何在短时间内挖到更多.等级更高的漏洞? 先分析这个问题,需求是什么? 更多? 等级更高? 短时间内? 首先要解决的是时间的问题 时间有限,所以你必须要快.如何快?把 ...
- ARP欺骗防御工具arpon
ARP欺骗防御工具arpon ARP欺骗是局域网最为常见的中人间攻击实施方式.Kali Linux提供一款专用防御工具arpon.该工具提供三种防御方式,如静态ARP防御SARPI.动态ARP防御 ...
- ArduinoYun教程之Arduino编程环境搭建
ArduinoYun教程之Arduino编程环境搭建 Arduino编程环境搭建 通常,我们所说的Arduino一般是指我们可以实实在在看到的一块开发板,他可以是Arduino UNO.Arduino ...
- Nmap扫描教程之网络基础服务DHCP服务类
Nmap扫描教程之网络基础服务DHCP服务类 Nmap网络基础服务 网络基础服务是网络正常工作的基石,常见的网络基础服务包括DHCP服务和DNS服务.其中,DHCP服务用来为计算机动态分配IP地址:D ...
- LOJ.2863.[IOI2018]组合动作(交互)
题目链接 通过两次可以先确定首字母.然后还剩下\(n-1\)位,之后每一位只有三种可能. 最简单的方法是每次确定一位,通过两次询问显然可以确定.但是只能一次询问. 首字母只会出现一次,即我们可以将串分 ...