android 中 SQLiteOpenHelper的封装使用详解
作者:上官若枫 发布时间:2022-11-09 12:36:57
标签:android,SQLiteOpenHelper
在android中常用存储数据的基本就三种,sqlite,SharedPreferences,文件存储,其中针对于对象存储,使用sqlite比较多,因为可以对其进行增删改查。本文主要讲解SQLiteOpenHelper的封装使用,代码引用自https://github.com/iMeiji/Toutiao
具体使用
主要方法包括创建数据库和数据库的升级。
构造函数:包含三个参数,context,name,factory,version
onCreate:主要创建了三张表单
getDatabase:这里其实可以获取两个数据库,分别是getWritableDatabase与getReadableDatabase,这两者的区别不是特别大,都具有对数据库的读写 权限。
getWritableDatabase取得的实例是以读写的方式打开数据库,如果打开的数据库磁盘满了,此时只能读不能写,此时调用了getWritableDatabase的实例,那么将会发生错误(异常)
getReadableDatabase取得的实例是先调用getWritableDatabase以读写的方式打开数据库,如果数据库的磁盘满了,此时返回打开失败,继而用getReadableDatabase的实例以只读的方式去打开数据库
onUpgrade:主要用于数据库的升级,这里面
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "Toutiao";
private static final int DB_VERSION = 5;
private static final String CLEAR_TABLE_DATA = "delete from ";
private static final String DROP_TABLE = "drop table if exists ";
private static DatabaseHelper instance = null;
private static SQLiteDatabase db = null;
private DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
private static synchronized DatabaseHelper getInstance() {
if (instance == null) {
instance = new DatabaseHelper(InitApp.AppContext, DB_NAME, null, DB_VERSION);
}
return instance;
}
public static synchronized SQLiteDatabase getDatabase() {
if (db == null) {
db = getInstance().getWritableDatabase();
}
return db;
}
public static synchronized void closeDatabase() {
if (db != null) {
db.close();
}
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(NewsChannelTable.CREATE_TABLE);
db.execSQL(MediaChannelTable.CREATE_TABLE);
db.execSQL(SearchHistoryTable.CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch (oldVersion) {
case 1:
db.execSQL(MediaChannelTable.CREATE_TABLE);
break;
case 2:
db.execSQL(CLEAR_TABLE_DATA + NewsChannelTable.TABLENAME);//删除表中的数据
break;
case 3:
ContentValues values = new ContentValues();
values.put(NewsChannelTable.ID, "");
values.put(NewsChannelTable.NAME, "推荐");
values.put(NewsChannelTable.IS_ENABLE, 0);
values.put(NewsChannelTable.POSITION, 46);
db.insert(NewsChannelTable.TABLENAME, null, values);//新建表
break;
case 4:
db.execSQL(SearchHistoryTable.CREATE_TABLE);
break;
}
}
}
表操作的封装
addInitData添加初始化数据
add插入到表中
query查询特定数据
public class NewsChannelDao {
private SQLiteDatabase db;
public NewsChannelDao() {
this.db = DatabaseHelper.getDatabase();
}
public void addInitData() {
String categoryId[] = InitApp.AppContext.getResources().getStringArray(R.array.mobile_news_id);
String categoryName[] = InitApp.AppContext.getResources().getStringArray(R.array.mobile_news_name);
for (int i = 0; i < 8; i++) {
add(categoryId[i], categoryName[i], Constant.NEWS_CHANNEL_ENABLE, i);
}
for (int i = 8; i < categoryId.length; i++) {
add(categoryId[i], categoryName[i], Constant.NEWS_CHANNEL_DISABLE, i);
}
}
public boolean add(String channelId, String channelName, int isEnable, int position) {
ContentValues values = new ContentValues();
values.put(NewsChannelTable.ID, channelId);
values.put(NewsChannelTable.NAME, channelName);
values.put(NewsChannelTable.IS_ENABLE, isEnable);
values.put(NewsChannelTable.POSITION, position);
long result = db.insert(NewsChannelTable.TABLENAME, null, values);
return result != -1;
}
public List<NewsChannelBean> query(int isEnable) {
Cursor cursor = db.query(NewsChannelTable.TABLENAME, null, NewsChannelTable.IS_ENABLE + "=?",
new String[]{isEnable + ""}, null, null, null);
List<NewsChannelBean> list = new ArrayList<>();
while (cursor.moveToNext()) {
NewsChannelBean bean = new NewsChannelBean();
bean.setChannelId(cursor.getString(NewsChannelTable.ID_ID));
bean.setChannelName(cursor.getString(NewsChannelTable.ID_NAME));
bean.setIsEnable(cursor.getInt(NewsChannelTable.ID_ISENABLE));
bean.setPosition(cursor.getInt(NewsChannelTable.ID_POSITION));
list.add(bean);
}
cursor.close();
return list;
}
public List<NewsChannelBean> queryAll() {
Cursor cursor = db.query(NewsChannelTable.TABLENAME, null, null, null, null, null, null);
List<NewsChannelBean> list = new ArrayList<>();
while (cursor.moveToNext()) {
NewsChannelBean bean = new NewsChannelBean();
bean.setChannelId(cursor.getString(NewsChannelTable.ID_ID));
bean.setChannelName(cursor.getString(NewsChannelTable.ID_NAME));
bean.setIsEnable(cursor.getInt(NewsChannelTable.ID_ISENABLE));
bean.setPosition(cursor.getInt(NewsChannelTable.ID_POSITION));
list.add(bean);
}
cursor.close();
return list;
}
public void updateAll(List<NewsChannelBean> list) {
}
public boolean removeAll() {
int result = db.delete(NewsChannelTable.TABLENAME, null, null);
return result != -1;
}
}
来源:https://www.jianshu.com/p/7a8537865643


猜你喜欢
- 前言为了便于文件在网络中的传输和保存,通常将文件进行压缩操作,常用的压缩格式有rar、zip和7z,本文将介绍在C#中如何对这几种类型的文件
- 首先需要一个自定义view用来签字使用,可以修改颜色和画笔的粗细,可以擦拭重新画package com.android.tcm.view;i
- 前言本来是打算用C#爬取天气网站上的信息,然后用正则表达过滤有用信息的,但是很淦,正则表达式太难了。无意间找到添加web引用的方式来获取天气
- JAVA常用关键字及其用法简要说明Abstract: 抽象的 一个Java语言中的关键字,用在类的声明中来指明一个类是不能被实例化的,但是可
- 简介AccessibilityService的设计初衷是为了辅助有身体缺陷的群体使用Android应用,它的设计贯穿着Android的控件树
- Servlet 3.0之前的版本中,文件上传是个挺让人头疼的问题,虽然有第三方框架来实现,但使用也还是比较麻烦,在Servlet 3.0中,
- 一、启动android默认浏览器这样子,android就可以调用起手机默认的浏览器访问。二、指定相应的浏览器访问1、指定android自带的
- 1、conditional注解介绍含义: 基于条件的注解作用: 根据是否满足某一个特定条件来决定是否创建某个特定的bean意义: Sprin
- 正文 #方法一:使用string.Contains方法string.Contains是大小写敏感的,如果要用该方法来判断一个str
- 本文实例为大家分享了Android自定义View实现拖动自动吸边的具体代码,供大家参考,具体内容如下自定义View,一是为了满足设计需求,二
- 降低springcloud版本,改成Hoxton.SR5就好了,再次改成Hoxton.SR12,也不报错了,很奇怪。也发现gateway版本
- 本文实例讲述了Android编程之消息机制。分享给大家供大家参考,具体如下:一、角色描述1.Looper: 一个线程可以产生一个Looper
- 注解定义: 注解是一种注释机制,它可以注释包、类、方法、变量、参数,在编译器生成类文件时,标注可以被嵌入到字节码中。注解的分类:内置注解Ov
- 利用java8流的特性,我们可以实现list中多个元素的 属性求和 并返回。案例:有一个借款待还信息列表,其中每一个借款合同包括:本金、手续
- 冒泡排序在八大排序中,冒泡排序是最为出名的排序算法之一!冒泡排序的代码还是相当简单的,两层循环,外层是冒泡轮数,里层是依次比较,这个算法的时
- 本文实例讲述了Java使用Random类生成随机数。分享给大家供大家参考,具体如下:一 代码import java.util.Random;
- Java 里的 * 是动态拦截 action 调用的对象,它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也
- 一、前言在日常工作中,如果涉及到与第三方进行接口对接,有的会使用WebService的方式,这篇文章主要讲解在.NET Framework中
- springboot多模块项目添加一新模块选择Maven Module,填写模块名若空白,catalog目录可选择internal更改包名完
- 上一篇文章:Android 10 启动分析之Init篇 (一)在前文提到,init进程会在在Trigger 为init的Action中,启动