今天对Android中数据库相关的操作和代码做了一个整理,便于自己之后的查阅。主要内容有:

1.原生数据库写法

2.终端进sqlite的操作

3.第三方库

4.事务处理

5.权限和路径

一、原生数据库写法

一般要先继承自SQLiteOpenHelper写一个Helper。

public class DatabaseHelper extends SQLiteOpenHelper {
private static final String name = "crashier"; //数据库名称
private static final int version = 1; //数据库版本
public DatabaseHelper(Context context) {
//第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age INTEGER)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("ALTER TABLE person ADD phone VARCHAR(12)"); //往表中增加一列
}
}  

在取到SQLiteDatabase类型的db后,一般操作是直接用其执行String类型的SQL语句。

原生也会支持一些操作的api:insert,update,delete。 参数需要传入数据内容

ContentValues cv=new ContentValues();
cv.put(TABLE_NUM,1);
cv.put(TABLE_DATA,"测试数据库数据");
db.insert(Test,null,cv);

二、终端进sqlite操作

1.设备链接

通过Open Module Settings,或者File→Project Structure,都可以看到SDK的位置。然后从终端进到SDK的此目录下

$cd /Users/dsx/Library/Android/sdk/platform-tools

Android的模拟器或是pos真机,可以使用usb链接或者wifi访问。如果是usb连接,可以直接访问。如果是wifi链接需要使用adb指令连接IP

$./adb devices

$./adb disconnect XXX.XXX.194.238
$./adb connect XXX.XXX.194.238

注:这里需要注意的一点是,部分网络环境下可能无法使用wifi,需要使用网线连接。最好关闭模拟器,让devices列表中只存在一个设备。

2.sqlite3操作

使用下列操作时,数据库列表只能有一个设备,否则会报错。 pos机的断开可以使用disconnect指令,模拟器的断开就是直接关闭。

然后使用下列操作打开并进入数据库

$./adb shell
$cd sdcard/path/subdir
$sqlite3 dsxniubility.db

终端内进入数据库一般操作也就是 查和删,这边介绍这两种情况。

$.table    //查看表的列表
$.dump 某个表 //查看表内数据
$.schema 某个表 //查看表的结构
$rm 某个表 // 删除

使用select语句展示时,默认的样式不清晰,建议设置成清晰明了的样式。 具体各种样式就不废话了,直接给个最优样式。

$.nullvalue null    //空字段用null占位
$.mode column //隔得比较开的一种样式
$.headers on //显示表头
$.width 5,5 //表宽度减短获得更大空间
$.show //查看现在的设置情况

在退出的时候有个小坑,这三种退出指令要在合适的场景下敲

$.exit;     //在一个语句中退出
$.exit //从数据表中退出
$exit //从数据库操作中退出

三、第三方库

关于第三方库,安卓常用的也就是ORMLite和GreenDao了,前者的使用较为简单是使用反射原理写的,性能不如后者。

greendao官网有一个非常明显性能对比图,所以往下就只写greendao了。

GREENDAO 是一个基于Android的第三方数据库管理工具,其设计的主要特点

  • 一个精简的库

  • 性能最大化

  • 内存开销最小化

  • 易于使用的 APIs

  • 对 Android 进行高度优化

1.greenDao配置

项目从零开始如何配置

①.build.gradle

compile 'org.greenrobot:greendao:2.2.1'

②.新建Module,名字类似与DaoGenerator

File→New→NewModule→java Library

③.给新建的Module的build.gradle配置

apply plugin: 'java'

task(run, dependsOn: 'classes', type: JavaExec) {
main = 'com.example.MainGen'
classpath = sourceSets.main.runtimeClasspath
systemProperty 'user.dir', project.rootDir
} dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'org.greenrobot:greendao-generator:2.2.0' targetCompatibility = '1.7'
sourceCompatibility = '1.7'
}

④.上面说的MainGen需要自己创建一个类

里面实现一个main函数,里面做一些配置

public static void main(String[] args) throws Exception{

    // 获取一些标识,设定scheme
String relativePath = System.getProperty("user.dir");
int DB_VERSION = 201666;
System.out.print("dbVersion is:" + DB_VERSION);
Schema schema = new Schema(DB_VERSION,"com.dsx.a201666"); schema.enableActiveEntitiesByDefault();
schema.enableKeepSectionsByDefault(); // 这里可能会有很多创建创建数据表的方法
createMenuItem(schema); // 代码生成路径的指定和执行
String daoPath = relativePath + "/app/src/main/java";
File daoDir = new File(daoPath);
if (!daoDir.isDirectory()){
//noinspection ResultOfMethodCallIgnored
daoDir.mkdirs();
}
new DaoGenerator().generateAll(schema,daoPath); }

上面有两个特殊属性解释一下

enableActiveEntitiesByDefault   如果开启 则支持实体类之间update,refresh,delete等操作。 所以这属性一般场景都是不开启的。

enableKeepSectionsByDefault   如果开启 则支持用户给模型自定义数据,会产生下列代码,在这代码之间写的属性,可以用但不会往数据库存。

// KEEP INCLUDES - put your custom includes here
// KEEP INCLUDES END // KEEP FIELDS - put your custom fields here
// KEEP FIELDS END // KEEP METHODS - put your custom methods here
// KEEP METHODS END

⑤.右键执行一下main函数,生成各种文件(DaoMaster,DaoSession,模型类的entity 和Dao)

也可以在build.gradle中设置preBuild.dependsOn让他在程序编译时就自动执行

2.greenDao使用

首先在greenDao的入口,MainGen文件中用greenDao的api创建数据库

private static void createCategoryTable(Schema schema){
Entity entity = schema.addEntity("SnackCategory");
entity.implementsSerializable();
entity.addIntProperty("id").primaryKey().autoincrement();
entity.addIntProperty("no");
Property orderProperty = entity.addLongProperty("orderId").getProperty();
entity.addToOne(orderBase, orderProperty);
entity.addStringProperty("name");
}

main函数中调用后会自动生成SnackCategory 和 SnackCategoryDao 文件,前者相当于实体类,后者是操作层,利用Dao后缀文件进行read,load,insert等操作。

serializable和parcelable区别, 前者用于保存到本地文件数据库中,网络流传输。 后者常用于内存中的传输,性能更好。

greenDao内部提供了几乎所有功能的api可以自行去头文件里看,下面列出基本操作

//删
session.getSnackCategoryDao().deleteAll();
//存
session.getSnackCategoryDao().insert(cate);
session.getSnackCategoryDao().insertInTx(cateList);
//取
List<SnackCategory> categoryList = session.getSnackCategoryDao().loadAll();

按照一定的要求取数据:

取出所有种类为主食的item 然后按照价格排序

List<SnackFood> nicefoods = session.getSnackFoodDao().queryBuilder()
.where(SnackFoodDao.Properties.Categoryid.eq("主食")).orderAsc(SnackFoodDao.Properties.Price).list();//董铂然博客园

取出所有种类为主食,并且价格小于10元的菜品

QueryBuilder qb = session.getSnackFoodDao().queryBuilder();
qb.where(SnackFoodDao.Properties.Categoryid.eq("主食"),SnackFoodDao.Properties.Price.le(10.0));
List goodfoods = qb.list();

四、事务处理

对于重要且耗时操作需要加入到事务中,避免极端情况所产生的问题

SQLiteDatabase database = session.getDatabase();
database.beginTransaction();
try {
session.getSnackCategoryDao().deleteAll();
session.getSnackFoodDao().deleteAll();
session.getSnackCategoryDao().insertInTx(cateList);
session.getSnackFoodDao().insertInTx(snackList);
database.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
database.endTransaction();
}

五、sd卡权限、路径

1.权限获取

这个SD卡的权限获取和其他Android6.0的运行时权限获取差不多,大致分为三个操作:查询是否有权限,请求获取权限,用户选择后的回调方法

查询权限

private boolean lackPermission() {
return ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED; //董铂然博客园
}

请求获取权限

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_PHONE_STATE}, WRITE_EXTERNAL_STORAGE_REQUEST_CODE);  

请求后点击的回调方法

@Override
public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
if(requestCode == mRequestCode(12)){
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 授权通过
} else {
// 授权失败
}
}
}
}

2.存储路径

判断SDK有权限放到sd卡里 ,无权限就放到根目录
public DaoMaster.OpenHelper provideOpenHelper() {
File path = new File(Environment.getExternalStorageDirectory(), "path/subdir/" + DATABASE_NAME);
path.getParentFile().mkdirs();
if (path.getParentFile().exists()) {
return new DaoOpenHelper(BaseApplication.application(), path.getAbsolutePath(), null);
} else {
return new DaoOpenHelper(BaseApplication.application(), DATABASE_NAME, null);
}
}

Android数据库相关整理的更多相关文章

  1. Android——数据库相关(课堂整理)

    layout文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...

  2. 自己动手写Android数据库框架

    前言 相信不少开发人员跟我一样,每次都非常烦恼自己写数据库,并且那些数据库语句也经常记不住.当然网上也有非常多非常好的数据库框架,你能够直接拿来用,可是 非常多时候我们的项目.特别是一个小型的Andr ...

  3. Android数据库高手秘籍(二):创建表和LitePal的基本用法

    原文:http://blog.jobbole.com/77157/ 上一篇文章中我们学习了一些Android数据库相关的基础知识,和几个颇为有用的SQLite命令,都是直接在命令行操作的.但是我们都知 ...

  4. android中与SQLite数据库相关的类

    为什么要在应用程序中使用数据库?数据库最主要的用途就是作为数据的存储容器,另外,由于可以很方便的将应用程序中的数据结构(比如C语言中的结构体)转化成数据库的表,这样我们就可以通过操作数据库来替代写一堆 ...

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

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

  6. Android笔记(七十三) Android权限问题整理 非常全面

    Android权限系统非常庞大,我们在Android系统中做任何操作都需要首先获取Android系统权限,本文记录了所有的Android权限问题,整理一下分享给大家. 访问登记属性 android.p ...

  7. Android 数据库框架OrmLite的使用(一)

    在这里记录下最基本的用法,官网上可了解相关的介绍. 1.下载OrmLite jar 在下载android的:ormlite-android-4.48.jar和ormlite-core-4.48.jar ...

  8. Android数据库升级

    随着Android应用版本的迭代,经常遇到数据库表结构发生改变,或者一些指定的表数据需要更新.这也就引出一个问题Android数据库的更新问题. Android数据库升级分类 Android数据库更新 ...

  9. 快速上手Android数据库操作

    Android采用关系型数据库SQLite3,它是一个支持SQL轻量级的嵌入式数据库,在嵌入式操作系统上有很广泛的应用,WM采用的也是SQLite3 关于过于.原理方面的东西在这篇文章里不会提到,但是 ...

随机推荐

  1. 2015微软MVP全球峰会见闻

    2015.10.31-2015.11.8 一周的时间完成微软MVP全球峰会旅程,这一周在不断的倒时差,行程安排非常的紧张,还好和大家请假了没有更新微信公众号,今天开始继续更新微信公众号,开始新的旅程, ...

  2. 【已解决】Https请求——基础连接已经关闭 发送时发生错误

    本人在做商用项目的推送消息功能时,借助第三方推送服务.这里避免有打广告的嫌疑,就不报名字了.由于是通过调用API接口,所以Post方法是自己写的,但是在开发环境是可以正常推送的,但是一上线就出各种问题 ...

  3. 剁手党也有春天 -- 淘宝 UWP ”比较“功能诞生记

    前言 网购已经不再是现在的时髦,而变成了我们每天的日常生活.上网已经和买买买紧密地联系在了一起,成为了我们的人生信条.而逛街一词,越来越多地变成了一种情怀.有时候我们去逛街,要么是为了打发时间,要么是 ...

  4. Maven实战:Maven生命周期

    前言 之前有写过一篇文章Maven实战,介绍了Maven的一些基本概念,以及对于一个初学者而言的Maven基础知识,当时在我看来掌握了这些基本是够用的. 随着工作的深入,越来越感觉对于Maven的理解 ...

  5. Failure to find xxx in xxx was cached in the local repository, resolution will not be reattempted until the update interval of nexus has elapsed or updates are forced @ xxx

    问题: 在linux服务器上使用maven编译war时报错: 16:41:35 [FATAL] Non-resolvable parent POM for ***: Failure to find * ...

  6. Android Weekly Notes Issue #231

    Android Weekly Issue #231 November 13th, 2016 Android Weekly Issue #231 Android Weekly阅读笔记, Issue #2 ...

  7. 《JS设计模式笔记》构造函数和工厂模式创建对象

    工厂模式 function createPerson (name,age,job) { var o=new Object(); o.name=name; o.age=age; o.job=job; o ...

  8. Restful 介绍及SpringMVC+restful 实例讲解

    restful不是一个框架,称为一种编码更烦更贴切吧,其核心类位于spring-web.jar中,即RestTemplate.class restful是rpc通过http协议的一种实现方式,和web ...

  9. MySQL关于exists的一个bug

    今天碰到一个很奇怪的问题,关于exists的, 第一个语句如下: SELECT ) FROM APPLY t WHERE EXISTS ( SELECT r.APPLY_ID FROM RECORD ...

  10. 不太被人提起的%%lockres%%的妙用

    %%lockres%% 这个值似乎很少被大家提到,甚至微软在官方文档中. 它返回是一个Hash Value,看乎这个值没什么用. 后来在实践也有它的妙用之处,比如在出现性能问题如LOCK时,一般先通过 ...