[Android]SQLite的使用

Android 数据存储提供了四种存储方式:

  • Shared Preferences

      使用键值对(Map(key, value))来存储数据 
  • Internal Storage

      内部存储,存储在设备内存的 私人数据 
  • External Storage

      外部存储,存储在外部设备的 公共数据 
  • SQLite Databases

      存储在关系型数据库;SQLite 是类似MySQL 的关系型数据库,因为其体较小,功能全,被运用在了大多嵌入式设备 

    Network Connection

SQLite 简介

非常小的关系型数据库

SQLiteOpenHelper

CRUD(增删改查)


import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;public class SimpleActivity extends Activity {private static final String INFO = "SimpleActivity";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.simple_layout);Log.i(INFO, INFO);SQLiteDatabase db = openOrCreateDatabase("simple.db", Context.MODE_PRIVATE, null);db.execSQL("DROP TABLE IF EXISTS Person");// 创建表db.execSQL("CREATE TABLE Person ("+ "  id INTEGER PRIMARY KEY AUTOINCREMENT,"+ "  name varchar(30),"+ "  age SMALLINT"+ ")");Log.d(INFO, "Create Table Successful");Person person = new Person();person.name = "Tikitoo";person.age = 23;// 插入数据db.execSQL("INSERT INTO Person VALUES(NULL , ?, ?)", new Object[]{person.name, person.age});Log.d(INFO, "Insert Successful");person.name = "Davin";person.age = 30;ContentValues cv = new ContentValues();cv.put("name", person.name);cv.put("age", person.age);// 插入ContentValue 中的数据db.insert("Person", null, cv);Log.d(INFO, "ContentValues Insert Successful");cv = new ContentValues();cv.put("age", 35);// 更新数据db.update("Person", cv, "name = ?", new String[]{"Davin"});Log.d(INFO, "Update Successful");Cursor cursor = db.rawQuery("SELECT * FROM Person", null);while (cursor.moveToNext()) {int id = cursor.getInt(cursor.getColumnIndex("id"));String name = cursor.getString(cursor.getColumnIndex("name"));int age = cursor.getInt(cursor.getColumnIndex("age"));Log.d("INFO", id + name + age);}Log.d(INFO, "Query Successful");cursor.close();db.delete("Person", "age < ?", new String[]{"25"});Log.d(INFO, "Delete Successful");db.close();// deleteDatabase("tikitoo_sqlite.db");}
}

参考:

Android SQLite Database Tutorial
Android中SQLite应用详解 - scott's blog - 博客频道 - CSDN.NET

问题总结

使用SQLite 调试工具ADB(adb)

(android:adb环境变量的配置)[http://blog.csdn.net/huangbiao86/article/details/6664779]
使用ADB 工具查看adb shell

cd data,ls 出现错误,这是,输入su 回车即可,会请求访问权限,在手机同意一下;
adb opendir failed ,permission denied


当然Android 对于SQLite 处理封装的对象 SQLiteOpenHelper 来返回 SQLiteDatabase 对象来实现增删改查
我们再开发的时候,不能像上面写得那么简单,需要对封装一个子类,提供SQLiteOpenHelper 对象;

封装的SQLiteOpenHelper 对象

package com.tikitoo.android.sqlite.util;import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;/*** Created by Tikitoo1 on 2014/11/12.*/
public class DBHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = "test.db";private static final int DATABASE_VERSION = 1;public DBHelper(Context context) {// 设置SQLiteDatabase.CursorFactory 为nullsuper(context, DATABASE_NAME, null, DATABASE_VERSION);}// 数据库第一次创建被调用@Overridepublic void onCreate(SQLiteDatabase db) {// 初始化创建一个表db.execSQL("CREATE TABLE IF NOT EXISTS Person"+ "(id INTEGER PRIMARY KEY AUTOINCREMENT, name varchar(30), age  SMALLINT");}// 如果数据库版本改变,则会调用@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 新增一个字段db.execSQL("ALTER TABLE Person ADD COLUMN other STRING");}
}

DatabaseSQLite 对象实现对数据库的增删改查


import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;import java.util.ArrayList;
import java.util.List;public class DBManager {private static final String INFO = DBManager.class.toString();private DBHelper helper;private SQLiteDatabase db;public DBManager(Context context) {helper = new DBHelper(context);db = helper.getWritableDatabase();// helper.getReadableDatabase();}// 新增一条数据,将数据存在Person 对象,在放在List 集合中,遍历集合,可以实现多条数据插入;public void add(List<Person> persons) {db.beginTransaction();try {for (Person person : persons) {db.execSQL("INSERT INTO Person VALUES(NULL, ?, ?, ?)",new Object[]{person.name, person.age, person.info});}// 设置事物db.setTransactionSuccessful();} finally {// 结束事物db.endTransaction();}}// 更新一条数据,通过name 来修改agepublic void update(Person person) {ContentValues cv = new ContentValues();cv.put("age", person.age);cv.put("info", person.info);// 参数,(表名, ContentValues 对象, where 条件,where 条件对应的值)db.update("Person",cv, "name = ?", new String[]{person.name});}public void delete(Person person) {db.delete("Person", "age >= ?", new String[]{"" + person.age});// String.valueOf(person.age);}public List<Person> person() {List<Person> lists = new ArrayList<Person>();// 使用rawQuery() 方法,返回游标对象,遍历出数据库的数据Cursor cursor = db.rawQuery("SELECT * FROM Person", null);while (cursor.moveToNext()) {int _id = cursor.getInt(cursor.getColumnIndex("id"));String name = cursor.getString(cursor.getColumnIndex("name"));int age = cursor.getInt(cursor.getColumnIndex("age"));String info = cursor.getString(cursor.getColumnIndex("info"));Log.i(INFO, new Person(_id, name, age, info).toString());}return lists;}// 关闭数据库public void closeDB() {db.close();}
}

对了还有将数据表使用JavaBean 处理,将数据存储在Person 对象,比较方便

public class Person {public int _id;     // id,唯一标识public String name; // 姓名public int age;     // 年龄public String info; // 备注信息public Person() {}public Person(String name, int age, String info) {this.name = name;this.age = age;this.info = info;}public Person(int _id, String name, int age, String info) {this._id = _id;this.name = name;this.age = age;this.info = info;}// 重写toString() 方法@Overridepublic String toString() {StringBuilder sb = new StringBuilder();sb.append("Person[ ");sb.append("name = " + this.name);// sb.append("; id = " + _id);sb.append("; age = " + this.age);sb.append("; info = " + this.info);sb.append(" ]");return sb.toString();}
}

getReadableDatabase() 和getWritableDatabase() 方法的区别:

getReadableDatabase:

首先判断数据库实例是否是打开状态,
如果是,则打开一个可读写的数据库实例;
如果遇到磁盘已满,获取失败,再以可读模式打开数据库,返回数据库实例

getWritableDatabase:

如果不为空,已经打开,并不是以只读模式打开的,
如果mDatabase 不为空则加锁,然后创建或打开新的数据库实例,比较版本,为数据库设置新的版本号,最后把不为空的mDatabase 解锁,把新创建的数据库实例赋值给 mDatabase,并返回新的实例;

总结

所以,如果不遇到磁盘已满的情况下,两个方式返回的数据库实例是一样的,如果担心这种方式发生,先调用 getWritableDatabase 方法,
如果异常,则在调用 getReadableDatabase ,当然这个时候的数据库实例是只读的

转载于:https://www.cnblogs.com/zhousysu/p/5483874.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一百四十五节,JavaScript,同步动画

JavaScript&#xff0c;同步动画 将上一节的&#xff0c;移动透明动画&#xff0c;修改成可以支持同步动画&#xff0c;也就是可以给这个动画方法多个动画任务&#xff0c;让它同时完成 原理&#xff1a; 向方法里添加一个属性&#xff0c;这个属性是一个对象&#xff0c;同步动…

Exchange Server 2016管理系列课件39.新建本地移动请求

场景通过新建本地移动请求&#xff0c;可以很方便的将用户邮箱从一个数据库迁移到另外一个数据库。1&#xff09;跨平台邮件迁移&#xff1b;&#xff08;低exchange迁移到高版本exchange&#xff09;2&#xff09;数据库平衡与优化&#xff1b;&#xff08;企业当中&#xff0…

【数据库学习】——【汇总】MySQL数据库下载与安装(Msi文件安装和免安装版本)、Navicat下载与安装

目录 1、MySQL数据库下载与安装 1&#xff09;MySQL数据库下载 MySQL官网 MySQL数据库下载 2&#xff09;MySQL 通过msi文件安装 3&#xff09;MySQL免安装版本使用 1&#xff09;将免安装包移动到安装的文件夹位置&#xff1b; 2&#xff09;新建data文件夹 3&#xff…

Val编程-文本操作

Val系统相对于高级语言来说&#xff0c;对于文本操作的功能相当的弱。 一般的文本&#xff08;文件夹&#xff09;操作有&#xff1a; 1.新建文本&#xff0c; 2.删除文本&#xff0c; 3.新建文件夹&#xff0c; 4.删除文件夹&#xff0c; 5.文本重命名&#xff0c; 6.文…

Linux高级编程--01.vi命令

VI是Linux/Unix下标配的一个纯字符界面的文本编辑器。由于不支持鼠标功能&#xff0c;也没有图形界面&#xff0c;相关的操作都要通过键盘指令来完成&#xff0c;需要记忆大量命令。因此很多人不大喜欢它&#xff0c;但同时由于键盘的方式往往比鼠标来得快&#xff0c;一旦熟练…

【数据库学习】——纠错:mysql Authentication plugin ‘caching_sha2_password‘ is not supported

目录 1、环境介绍 2、问题描述 3、原因分析 4、 解决方案 1&#xff09;方法一&#xff1a;直接改成mysql_native_password验证方式 2&#xff09;方案二&#xff1a; 利用sql命令将验证机制修改 ① 打开命令行窗口——cmd ② 登录mysql数据库 ③ 查看不同用户名的身份…

xcode中用pods管理第三方库转

安装pods &#xff1a;http://www.cnblogs.com/wangluochong/p/5567082.html 史上最详细的CocoaPods安装教程 --------------------------------------------- 第一步&#xff1a;Cmmand&#xff0b;空格&#xff0c;搜索"终端"&#xff0c;使用cd命令进入到我们项目…

Val编程-界面编程

由于示教盒是一个黑白的分辨率为&#xff08;14*40&#xff09;的液晶屏&#xff0c;用户交互不是很好&#xff0c;界面不友好。而且没有鼠标导航与触摸屏。 界面编程函数 1.void cls() 2.void title(string sText) 3.void put(string sText), void put(num nValue) 4.void put…

【机器学习笔记四】分类算法 - 逻辑回归

参考资料 【1】 Spark MLlib 机器学习实践 【2】 统计学习方法 1、Logistic分布 设X是连续随机变量&#xff0c;X服从Logistic分布是指X具有下列分布函数和密度函数 &#xff0c;。其中u为位置参数&#xff0c;γ为形状参数。如下图&#xff1a; 分布函数以(u,1/2)为中心…

FPFH+ICP点云配准

A, UniformSampling降噪B, ISS计算关键点, FPFH特征在FeatureCloud::setInputCloud中读入点云,并调用processInput进行处理:processInput处理包括: 1, computeSurfaceNormals () 使用NormalEstimation计算得到表面法向量2, computeLocalFeatures () FPFHEstimationKdTreeIS…

【python 学习】——pycharm终端解释器和Python解释器配置

目录 1、pycharm终端运行的时候前面带有PS&#xff0c;是什么意思&#xff0c;怎么变成cmd? 1&#xff09;File——settings 2&#xff09;tools——terminal——shellPath 2、pycharm怎么切换不同的Python解释器&#xff1f; 1&#xff09;File——settings 2&#xff09…

在linux下实现mysql自动备份数据

使用的系统为CentOS&#xff0c;mysql版本为5.6 备份功能主要利用以下功能实现&#xff1a; mysql命令中的mysqldump命令 linux下脚本编写 linux下crontab定时任务的使用 首先确定你要存放脚本的目录和存放备份数据的目录 首先进行以下修改&#xff08;因为在命令行或者脚本中写…

面向未来编程

我们一直以来都知道面向对象编程&#xff0c;面向过程编程。大多数时候还是面向工资编程&#xff0c;面向生活编程。面向任务编程&#xff0c;面向公司编程&#xff0c;面向领导编程。 工资不给力&#xff0c;心里认为委屈&#xff1b;生活有压力。影响工作情绪。任务完毕就好…

Plotclock

调试程序&#xff0c;运行调试程序&#xff0c;舵机会移动两只悬臂分别停留在一只水平另一只垂直的位置上。如果差距非常大&#xff0c;可拆下悬臂调节&#xff0c;如果比较接近了&#xff0c;就修改程序第3~6行的四个参数 SERVOFAKTORLEFT 左悬臂垂直位置&#xff0c;SERVOFAK…

js性能优化--学习笔记

《高性能网站建设进阶指南》&#xff1a; 1.使用局部变量&#xff0c;避免深入作用域查找&#xff0c;局部变量是读写速度最快的&#xff1b;把函数中使用次数超过一次的对象属性和数组存储为局部变量是一个好方法&#xff1b;比如for循环中的.length通常可以保存为局部变量。 …

struct和typedef struct在C与C++中用法

struct和typedef struct 分三块来讲述&#xff1a;   1 首先&#xff1a;//注意在C和C里不同     在C中定义一个结构体类型要用typedef:     typedef struct Student    {    int a;    }Stu;     于是在声明变量的时候就可&#xff1a;Stu stu1;(如…

【数据库学习】——Python实现mysql数据库SQL文件生成和导入

目录 1、将mysql数据导出到SQL文件中&#xff08;数据库存在的情况&#xff09; 2、将现有的sql文件数据导入到数据库中&#xff08;前提数据库存在&#xff09; 3、利用Navicat导出SQL文件和导入SQL文件 1&#xff09;从数据库导出SQL文件 2&#xff09;导入SQL文件到数据…

lfcp——PB使用

场景&#xff1a;记录以备忘。 1 直接说明 pb连接说明&#xff1a;目前项目共有性能、功能、业务、联调四个环境。所以pb可以连接四个不同的数据库。1.copy一份pb程序&#xff0c;修改main.ini文件中的DBCONNECT/DBCONNECT2位new&#xff0c;DBNAME/DBNAME2为oracle数据源中的源…

【重磅】Google官方推出了免费的、中文的、机器学习初级课程。

2019独角兽企业重金招聘Python工程师标准>>> 机器学习(Machine Learning, ML)是一门多领域交叉学科&#xff0c;涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它是人工智能的核心&#xff0c;是使计算机具有智能的根本途径&#xff0c;其应用遍及…

市面上常见arduino版本比较

http://arduino.cc/en/Main/Products 详细链接 如果是入门&#xff0c;那么首选UNO R3&#xff0c;方便又省心 如果不是特殊要求&#xff0c;不建议购买2560&#xff0c;因为贵啊 nano是块很好的控制器&#xff0c;买不买随你咯 非特殊场合使用不建…