项目效果地址:

SQlite
1. 创建数据库
Android中使用SQlite,需要自己创建库,建表,添加数据!好在Android中提供了SQLiteOpenHelper类来帮助创建使用数据库,我们只需要继承这个类就可以实现数据库的创建和对数据的操作了!Android 中创建数据库需要通过如下几步:创建一个类继承SQLiteOpenHelper,需要实现其三个方法:
构造方法:需要给SQLiteOpenHelper传递四个参数:(上下文,数据库名,游标工厂(通常为null),当前数据库版本号);
onCreate(): 表的创建,初始化操作
onUpgrade(): 表升级
还有:onDowngrade(): 表降级,onOpen:每次打开数据库,onBeforeDelete:

public class ThingManagerDBOpenHelper extends SQLiteOpenHelper {public static final String DB_NAME = "mysql.db";private static final int VERSION = 1;public ThingManagerDBOpenHelper(Context context) {super(context, DB_NAME, null, VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE IF NOT EXISTS "+ ThingDBController.TABLE_NAME+ String.format("("+ "%s INTEGER PRIMARY KEY AUTOINCREMENT, "+ "%s VARCHAR, "+ "%s INTEGER"+")", ThingManagerDBModel.ID, ThingManagerDBModel.MESSAGE, ThingManagerDBModel.TIME)) ;}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {……}}

说下SQlite的数据类型 :
NULL:    这个值为空值
VARCHAR(n):    长度不固定且其最大长度为 n 的字串,n不能超过 4000。
CHAR(n):    长度固定为n的字串,n不能超过 254。
INTEGER:    值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8.
REAL:    所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.
TEXT:    值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB:    值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改 变格式。
DATA:    包含了 年份、月份、日期。
TIME:    包含了 小时、分钟、秒。

2. 创建一个数据库存储对象

public final class ThingManagerDBModel {public static final String TABLE_NAME = "mysql_thing";public static final String ID = "_id";public static final String MESSAGE = "message";public static final String TIME = "time";int id;String message;long time;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public long getTime() {return time;}public void setTime(long time) {this.time = time;}public ContentValues toContentValues(){ContentValues cv = new ContentValues();cv.put(MESSAGE, message);cv.put(TIME, time);return cv;}
}

3. 创建一个数据库控制器实现增删改查
1. 增
使用Android APi来实现增加数据

 public boolean insertApi(int id, String message, long time){ThingManagerDBModel dbModel = new ThingManagerDBModel();if(id >= 0) {dbModel.id = id;}dbModel.message = message;dbModel.time = time;final boolean success = db.insert(TABLE_NAME, null, dbModel.toContentValues()) != -1;dbClose();return success;}

使用Sql语句实现增加数据

 public void insertRaw(String message, long time){String sql = " insert into " + TABLE_NAME + "(message,time) values(?,?)";Object[] args = {message,time};db.execSQL(sql,args);dbClose();}

2. 删
使用Api

public boolean deleteApi(String whereClause,String[] whereArgs){boolean sucess = db.delete(TABLE_NAME, whereClause,whereArgs) != -1;dbClose();return sucess;
}

使用Sql语句

 public void deleteRaw(String message){String sql = "delete from "+TABLE_NAME + " where message = ?";Object[] args = {message};db.execSQL(sql,args);dbClose();}

3. 改
使用api

public boolean updateApi(int id,String message,long time){ThingManagerDBModel dbModel = new ThingManagerDBModel();if(id >= 0) {dbModel.id = id;}dbModel.message = message;dbModel.time = time;boolean success = db.update(TABLE_NAME, dbModel.toContentValues(), "_id = ?", new String[]{String.valueOf(id)}) != -1;dbClose();return success;}

使用Sql条件修改

public void updateRaw(int id,String message,long time){String sql = "update "+TABLE_NAME + " set message = ?,time = ? where _id = ?";Object[] args = {message,time,id};db.execSQL(sql,args);dbClose();
}

4. 查
使用Api

/*** @param cloums 要查询的字段* @param selection 查询条件* @param selectionArgs 填充查询条件的值* @return*/public List<Thing> queryApi(String[] cloums,String selection,String[]  selectionArgs){try {Cursor c = db.query(TABLE_NAME, cloums, selection, selectionArgs, null, null, null);ArrayList<Thing> arrayList = new ArrayList<>();if (!c.moveToLast()) {return arrayList;}do {Thing model = new Thing();model.setId(c.getInt(c.getColumnIndexOrThrow(ThingManagerDBModel.ID)));model.setTime(c.getLong(c.getColumnIndexOrThrow(ThingManagerDBModel.TIME)));model.setMessage(c.getString(c.getColumnIndexOrThrow(ThingManagerDBModel.MESSAGE)));arrayList.add(model);} while (c.moveToPrevious());c.close();return arrayList;}catch (Exception e){e.printStackTrace();}finally {dbClose();}return new ArrayList<>();}

使用sql条件

 public List<Thing> queryRawById(String  id){//cursor获取的一定是在这里申明的查询条件值String sql = "select _id,message,time from "+TABLE_NAME + " where _id = ?";Cursor cursor = db.rawQuery(sql, new String[]{id});ArrayList<Thing> arrayList = new ArrayList<>();if (!cursor.moveToLast()) {return arrayList;}do {Thing model = new Thing();model.setId(cursor.getInt(cursor.getColumnIndex(ThingManagerDBModel.ID)));model.setTime(cursor.getLong(cursor.getColumnIndex(ThingManagerDBModel.TIME)));model.setMessage(cursor.getString(cursor.getColumnIndexOrThrow(ThingManagerDBModel.MESSAGE)));arrayList.add(model);} while (cursor.moveToPrevious());cursor.close();dbClose();return arrayList;}

4. 数据库的升级
在开发的过程中,我们避免不了需要修改数据库结构,添加字段或者删除字段!我们通过增加传递给SQLiteOpenHelper的版本值,得到onUpgrade方法的回调来实现对数据库的操作来进行升级。这里需要注意的是,如果用户安装版本1之后直接跳装版本3,这时候我们就需要在onUpgrade方法中通过oldVersion来进行每一个版本的逐渐升级,方法如下:


public class ThingManagerDBOpenHelper extends SQLiteOpenHelper {public static final String DB_NAME = "mysql.db";private static final int VERSION = 3;……@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {switch (oldVersion){case 1:upToDbVersion2(db);case 2:upToDbVersion3(db);default:break;}}public void upToDbVersion2(SQLiteDatabase db){db.execSQL("ALTER TABLE " + ThingDBController.TABLE_NAME + " ADD COLUMN add_user_name text");}public void upToDbVersion3(SQLiteDatabase db) {ContentValues values = new ContentValues();values.put("message", "版本升级后的数据");db.update(ThingDBController.TABLE_NAME, values, null, null);}
}

问题
查询问题
Cursor只会拥有你查询的数据,如果在查询条件里面没有申请,Cursor里面就不会包含这个值,就会出现如下异常:
错误写法:

 String sql = "select message,time from "+TABLE_NAME + " where _id = ?";//条件里面没有申请查询_id的值……something……model.setId(cursor.getInt(cursor.getColumnIndex(ThingManagerDBModel.ID)));//在这里提取会报异常

正确写法:

 String sql = "select  _id,message,time from "+TABLE_NAME + " where _id = ?";//条件里面没有申请查询_id的值……something……model.setId(cursor.getInt(cursor.getColumnIndex(ThingManagerDBModel.ID)));//这里进行id值的提取

异常:

java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
        at android.database.CursorWindow.nativeGetLong(Native Method)
        at android.database.CursorWindow.getLong(CursorWindow.java:513)
        at android.database.CursorWindow.getInt(CursorWindow.java:580)
        at android.database.AbstractWindowedCursor.getInt(AbstractWindowedCursor.java:69)
        at com.aserbao.aserbaosandroid.functions.database.mySql.beans.ThingDBController.queryRawById(ThingDBController.java:109)
        at com.aserbao.aserbaosandroid.functions.database.mySql.MySqlActivity.queryData(MySqlActivity.java:70)
        at com.aserbao.aserbaosandroid.functions.database.base.DataBaseBaseActivity.onViewClicked(DataBaseBaseActivity.java:85)
        at com.aserbao.aserbaosandroid.functions.database.base.DataBaseBaseActivity_ViewBinding$2.doClick(DataBaseBaseActivity_ViewBinding.java:48)
        at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:22)
        at android.view.View.performClick(View.java:6291)
        at android.view.View$PerformClick.run(View.java:24931)
        at android.os.Handler.handleCallback(Handler.java:808)
        at android.os.Handler.dispatchMessage(Handler.java:101)
        at android.os.Looper.loop(Looper.java:166)
        at android.app.ActivityThread.main(ActivityThread.java:7425)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)

一篇好文之Android数据库 SQLite全解析相关推荐

  1. 一篇好文之Android数据库 GreenDao的完全解析

    数据库GreenDao.jpg 之前在开发过程中,数据库基本上会使用Litepal或者SQlite自己写,最近换新环境,公司原先使用的数据库就是GreenDao,在各种情况的作用下,准备了解下Gree ...

  2. 一篇好文之Android数据库 GreenDao的使用指南(源码+案列)

    大家在使用学习使用GreenDao的时候遇到什么问题,欢迎在我的公众号aserbao给我留言,无偿服务!同时,欢迎大家来加入微信群二维码讨论群,一起讨论Android开发技术!群二维码定时在我公众号更 ...

  3. 《一》Android 数据库 SQlite SQLiteOpenHelper

    /* 大家都知道写博客会很累的,大热天的. 希望=转载请注明出处:http://blog.csdn.net/ta893115871 请不要可怜你的鼠标,(*^__^*) 嘻嘻-- */ 众所周知,数据 ...

  4. Android 数据库Sqlite的使用(1)

    在Android中,我们使用的数据库是一个轻量级的数据库 sqlite 下面我们来学习一下它的CURD操作 首先 我们需要创建一个类 继承自android自带的一个数据库帮助类SQLiteOpenHe ...

  5. Android数据库—SQLite

    目录 Android数据库-SQLite 在线查看数据库方法 继承SQLiteOpenHelper的类,加载驱动 在Activity中进行增删改查 增加数据 删除数据 修改数据 查询数据 在界面上进行 ...

  6. Android 数据库(SQLite)【简介、创建、使用(增删改查、事务、实战演练)、数据显示控件(ListView、Adapter、实战演练-绿豆通讯录)】

    目   录 (壹)SQLite数据库简介 (贰)数据库的创建 (叁)数据库的使用 3.1.SQlite的基本操作 3.1.1.添加数据 3.1.2.修改数据 3.1.3.查询数据 3.1.4.删除数据 ...

  7. Android 数据库 SQLite

    首先关于SQLite的介绍百度上看看就大致了解的差不多了. Android 操作数据库的关键步骤就在于实现API SQLiteOpenHelper,通常这个库辅助类来创建或打开数据库. 废话不多说直接 ...

  8. 《二》Android 数据库 SQlite SQLiteOpenHelper

    /**************************************************** 大家都知道写博客会很累的,大热天的. 希望=转载请注明出处:http://blog.csdn ...

  9. android绿豆通讯录xml,Android 数据库(SQLite)【简介、创建、使用(增删改查、事务、实战演练)、数据显示控件(ListView、Adapter、实战演练)】...

    目   录 (壹)SQLite数据库简介 (贰)数据库的创建 (叁)数据库的使用 3.1.SQlite的基本操作 3.1.1.添加数据 3.1.2.修改数据 3.1.3.查询数据 3.1.4.删除数据 ...

最新文章

  1. hive 中文comment乱码解决
  2. CMAKE_CURRENT_SOURCE_DIR
  3. 方案猿身高project联赛,艺术家,相反,养殖场!-------三笔
  4. JSR 303 – Bean Validation 介绍及最佳实践
  5. java lazy loading_java – Spring,@Transactional和Hibernate Lazy Loading
  6. 13个知识点,系统整理Python时间处理模块Datetime
  7. 工作333:uni-增加添加成功提示
  8. 虚拟资源拳王公社:闲鱼虚拟资源玩法案例拆解,教你玩转虚拟资源,货源+方法
  9. 【Java从0到架构师】RocketMQ 使用 - 集成 SpringBoot
  10. java horizontalbarchart_Android-MPChart,HorizontalBarChart 水平柱状图颜色渐变
  11. 剑指offer--面试题10
  12. CentOS6.2(64bit)下mysql5.6.16主从同步配置
  13. 二维傅里叶变换的理解和使用
  14. x96max+ 电视盒子如何刷入EmuELEC游戏系统
  15. java field的方法_Java Field 详解
  16. 李航《统计学习方法》第一章复习与习题参考解答
  17. ThreadLocal的介绍与使用
  18. 北航2019计算机学院就业报告,北京航空航天大学2019届毕业生就业质量年度报告.pdf...
  19. 手把手教你搭建免流服务器(只限于联通)
  20. 36 个助你成为专家需要掌握的 JavaScript 概念

热门文章

  1. 二补数(2’scomplement)乘法算法及其Verilog实现 - 固定系数h
  2. Android OnDeviceAppPrediction 优化
  3. Java程序设计-实验6-sdust
  4. IP防护等级解释说明
  5. 计算机信息管理 日语,2017年北京科技大学高职计算机信息管理(第一外语:日语)...
  6. 购买服务器的个人经验
  7. realme 拨号代码_手机拨号界面为什么会有quot;*和#quot;键?这2个键有什么用?望周知...
  8. PNAS:大脑是如何计算主观价值的?
  9. spring boot + vue 前后端下载文件文件
  10. Kong 优雅实现微服务网关鉴权,登录场景落地实战篇