切换导航
首页
技术问答
编程语言
前端开发
移动开发
开发工具
程序设计
行业应用
CMS系统
服务器
频道导航
▸ PHP
▸ Java
▸ Java SE
▸ Python
▸ C#
▸ C&C++
▸ Ruby
▸ VB
▸ asp.Net
▸ Go
▸ Perl
▸ netty
▸ Django
▸ Delphi
▸ Jsp
▸ .NET Core
▸ Spring
▸ Flask
▸ Springboot
▸ SpringMVC
▸ Lua
▸ Laravel
▸ Mybatis
▸ Asp
▸ Groovy
▸ ThinkPHP
▸ Yii
▸ swoole
▸ HTML
▸ HTML5
▸ JavaScript
▸ CSS
▸ jQuery
▸ Bootstrap
▸ Angularjs
▸ TypeScript
▸ Vue
▸ Dojo
▸ Json
▸ Electron
▸ Node.js
▸ extjs
▸ Express
▸ XML
▸ ES6
▸ Ajax
▸ Flash
▸ Unity
▸ React
▸ Flex
▸ Ant Design
▸ Web前端
▸ 微信小程序
▸ 微信公众号
▸ iOS
▸ Android
▸ Swift
▸ Hybrid
▸ Cocos2d-x
▸ Flutter
▸ Xcode
▸ Silverlight
▸ cocoa
▸ Cordova
前端之家
Sqlite
详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中
详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中
2020-06-22
Sqlite
前端之家
前端之家
收集整理的这篇文章主要介绍了
详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中
,
前端之家
小编觉得挺不错的,现在分享给大家,也给大家做个参考。
上一篇
跟各位童鞋介绍了SharedPreference 和 File流如何存储数据,并且推荐使用FileOutputStream/FileInputStream来存储咱们游戏数据,那么这一篇则是像大家介绍另外一种适合游戏数据存储的方式:
sql
ite 轻量级
数据库
!
先介绍几个基本概念知识:
什么是
sql
ite:
sql
ite是一款轻量级
数据库
,它的设计目的是嵌入式,而且它占用的资源非常少,在嵌入式设备中,只需要几百KB!!!!!
sql
ite的特性:
轻量级
使用
sql
ite 只需要带一个动态库,就可以享受它的全部
功能
,而且那个动态库的尺寸想当小。
独立性
sql
ite
数据库
的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。
隔离性
sql
ite
数据库
中所有的信息(比如表、视图、触发器等)都包含在一个
文件
夹内,方便管理和维护。
跨平台
sql
ite 目前
支持
大部分操作系统,不至电脑操作系统更在众多的手机系统也是能够运行,比如:Android。
多语言接口
sql
ite
数据库
支持
多语言编程接口。
安全性
sql
ite
数据库
通过
数据库
级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一
数据库
读取数据,但只能有一个可以写入数据.
优点:1.能存储较多的数据。
2.能将
数据库
文件
存放到SD卡中!
什么是
sql
iteDatabase?
一个
sql
iteDatabase 的实例代表了一个
sql
ite 的
数据库
,通过
sql
iteDatabase 实例的一些
方法
,我们可以执行
sql
语句,对数 据库进行增、删、查、改的操作。需要注意的是,
数据库
对于一个应用来说是私有的,并且在一个应用当中,
数据库
的名字也是惟一的。
什么是
sql
iteOpenHelper ?
根据这名字,我们可以看出这个类是一个辅助类。这个类主要
生成
一个
数据库
,并对
数据库
的版本进行管理。当在程序当中
调用
这个类的
方法
getWritableDatabase(),或者getReadableDatabase()
方法
的时候,如果当时没有数据,那么Android 系统就会
自动
生成
一 个
数据库
。
sql
iteOpenHelper 是一个抽象类,我们通常需要继承它,并且实现里边的3 个
函数
,
什么是 ContentValues 类?
ContentValues 类和Hashmap/Hashtable 比较类似,它也是负责存储一些名值对,但是它存储的名值对当中的名是一个
String 类型,而值都是基本类型。
什么是 Cursor ?
Cursor 在Android 当中是一个非常有用的接口,通过Cursor 我们可以对从
数据库
查询
出来的结果集进行
随机
的读写访问。
OK,基本知识就介绍到这里,下面开始上
代码
:还是按照我的一贯风格,
代码
中该解释的地方都已经在
代码
中及时注释和讲解了!
顺便来张项目截图:
先给出xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="
sql
练习!(如果你使用的SD卡存储数据方式,为了保证正常操作,请你先点击创建一张表然后再操作)"
android:textSize="20sp" android:textColor="#ff0000" android:id="@+id/tv_title" />
<Button android:id="@+id/
sql
_addOne" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="插入一条记录"></Button>
<Button android:id="@+id/
sql
_check" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="
查询
数据库
"></Button>
<Button android:id="@+id/
sql
_edit" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="
修改
一条记录"></Button>
<Button android:id="@+id/
sql
_deleteOne" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="
删除
一条记录"></Button>
<Button android:id="@+id/
sql
_deleteTable" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="
删除
数据表单"></Button>
<Button android:id="@+id/
sql
_newTable" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="新建数据表单"></Button>
</LinearLayout>
复制
代码
xml中定义了我们需要练习用到的几个操作按钮,这里不多解释了,下面看java源码:先看我们继承的
sql
iteOpenHelper 类
package com.himi;
import android.content.Context;
import android.database.
sql
ite.
sql
iteDatabase;
import android.database.
sql
ite.
sql
iteOpenHelper;
import android.util.Log;
/**
*
* @author Himi
* @解释 此类我们只需要传建一个构造
函数
以及重写两个
方法
就OK啦、
*/
public class
MysqL
iteOpenHelper extends
sql
iteOpenHelper {
public final static int VERSION = 1;// 版本号
public final static String TABLE_NAME = "himi";// 表名
public final static String ID = "id";// 后面ContentProvider使用
public final static String TEXT = "text";
public static final String DATABASE_NAME = "Himi.db";
public
MysqL
iteOpenHelper(Context context) {
// 在Android 中创建和打开一个
数据库
都可以使用openOrCreateDatabase
方法
来实现,
// 因为它会
自动
去检测是否存在这个
数据库
,如果存在则打开,不过不存在则创建一个
数据库
;
// 创建成功则返回一个
sql
iteDatabase对象,否则抛出异常FileNotFoundException。
// 下面是来创建一个名为"DATABASE_NAME"的
数据库
,并返回一个
sql
iteDatabase对象
super(context,DATABASE_NAME,null,VERSION);
}
@Override
// 在
数据库
第一次
生成
的时候会
调用
这个
方法
,一般我们在这个
方法
里边
生成
数据库
表;
public void onCreate(
sql
iteDatabase db) {
String str_
sql
= "CREATE TABLE " + TABLE_NAME + "(" + ID
+ " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT + " text );";
// CREATE TABLE 创建一张表 然后后面是我们的表名
// 然后表的列,第一个是id 方便操作数据,int类型
// PRIMARY KEY 是指主键 这是一个int型,用于唯一的标识一行;
// AUTOINCREMENT 表示
数据库
会为每条记录的key加一,确保记录的唯一性;
// 最后我加入一列文本 String类型
// ----------注意:这里str_
sql
是
sql
语句,类似dos命令,要注意空格!
db.exec
sql
(str_
sql
);
// exec
sql
()
方法
是执行一句
sql
语句
// 虽然此句我们
生成
了一张
数据库
表和包含该表的
sql
.himi
文件
,
// 但是要注意 不是
方法
是创建,是传入的一句str_
sql
这句
sql
语句表示创建!!
public void onUpgrade(
sql
iteDatabase db,int oldVersion,int newVersion) {
// 一般默认情况下,当我们插入
数据库
就立即更新
// 当
数据库
需要
升级
的时候,Android 系统会主动的
调用
这个
方法
。
// 一般我们在这个
方法
里边
删除
数据表,并建立新的数据表,
// 当然是否还需要做其他的操作,完全取决于游戏需求。
Log.v("Himi","onUpgrade");
}
复制
代码
我喜欢
代码
中立即附上解释,感觉这样
代码
比较让大家更容易理解和寻找,当然如果童鞋们不喜欢,可以告诉我,我改~嘿嘿~
下面看最重要的MainActivity中的
代码
:
import java.io.File;
import java.io.IOException;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
// ------------第三种保存方式--------《
sql
ite》---------
* @保存方式:
sql
ite 轻量级
数据库
、
* @优点: 可以将自己的数据存储到
文件
系统或者
数据库
当中, 也可以将自己的数据存
* 储到
sql
ite
数据库
当中,还可以存到SD卡中
* @注意1:
数据库
对于一个游戏(一个应用)来说是私有的,并且在一个游戏当中,
*
数据库
的名字也是唯一的。
* @注意2 apk中创建的
数据库
外部的进程是没有权限去读/写的,serif; font-size:12px; line-height:1.8em"> * 我们需要把
数据库
文件
创建到sdcard上可以
解决
类似问题.
* @注意3 当你
删除
id靠前的数据或者全部
删除
数据的时候,
sql
ite不会
自动
排序,
* 也就是说再
添加
数据的时候你不指定id那么
sql
ite默认还是在原有id最后
添加
一条新数据
* @注意4 android 中 的
sql
ite 语法大小写不敏感,也就是说不区分大小写;
public class MainActivity extends Activity implements OnClickListener {
private Button btn_addOne,btn_deleteone,btn_check,btn_deleteTable,serif; font-size:12px; line-height:1.8em"> btn_edit,btn_newTable;
private TextView tv;
private
MysqL
iteOpenHelper myOpenHelper;// 创建一个继承
sql
iteOpenHelper类实例
private
sql
iteDatabase
MysqL
;
//---------------以下两个成员变量是针对在SD卡中存储
数据库
文件
使用
// private File path = new File("/sdcard/himi");// 创建目录
// private File f = new File("/sdcard/himi/himi.db");// 创建
文件
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,serif; font-size:12px; line-height:1.8em"> WindowManager.LayoutParams.FLAG_FULLSCREEN);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
tv = (TextView) findViewById(R.id.tv_title);
btn_addOne = (Button) findViewById(R.id.
sql
_addOne);
btn_check = (Button) findViewById(R.id.
sql
_check);
btn_deleteone = (Button) findViewById(R.id.
sql
_deleteOne);
btn_deleteTable = (Button) findViewById(R.id.
sql
_deleteTable);
btn_newTable = (Button) findViewById(R.id.
sql
_newTable);
btn_edit = (Button) findViewById(R.id.
sql
_edit);
btn_edit.setOnClickListener(this);
btn_addOne.setOnClickListener(this);
btn_check.setOnClickListener(this);
btn_deleteone.setOnClickListener(this);
btn_deleteTable.setOnClickListener(this);
btn_newTable.setOnClickListener(this);
myOpenHelper = new
MysqL
iteOpenHelper(this);// 实例一个
数据库
辅助器
//备注1 ----如果你使用的是将
数据库
的
文件
创建在SD卡中,那么创建
数据库
MysqL
如下操作:
// if (!path.exists()) {// 目录存在返回false
// path.mkdirs();// 创建一个目录
// }
// if (!f.exists()) {//
文件
存在返回false
// try {
// f.createNewFile();//创建
文件
// } catch (IOException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
public void onClick(View v) {
try {
//备注2----如果你使用的是将
数据库
的
文件
创建在SD卡中,那么创建
数据库
MysqL
如下操作:
//
MysqL
=
sql
iteDatabase.openOrCreateDatabase(f,null);
//备注3--- 如果想把
数据库
文件
默认放在系统中,那么创建
数据库
MysqL
如下操作:
MysqL
= myOpenHelper.getWritableDatabase(); // 实例
数据库
if (v == btn_addOne) {//
添加
数据
// ---------------------- 读写句柄来插入---------
// ContentValues 其实就是一个哈希表HashMap, key值是字段
名称
,
//Value值是字段的值。然后 通过 ContentValues 的 put
方法
就可以
//把数据放到ContentValues中,然后插入到表中去!
ContentValues cv = new ContentValues();
cv.put(
MysqL
iteOpenHelper.TEXT,"测试新的数据");
MysqL
.insert(
MysqL
iteOpenHelper.TABLE_NAME,cv);
// inser() 第一个参数 标识需要插入操作的表名
// 第二个参数 :默认传null即可
// 第三个是插入的数据
// ----------------------
sql
语句插入--------------
// String INSERT_DATA =
// "INSERT INTO himi (id,text) values (1,'通过
sql
语句插入')";
// db.exec
sql
(INSERT_DATA);
tv.setText("
添加
数据成功!点击查看
数据库
查询
");
} else if (v == btn_deleteone) {//
删除
数据
// ---------------------- 读写句柄来
删除
MysqL
.delete("himi",
MysqL
iteOpenHelper.ID + "=1",serif; font-size:12px; line-height:1.8em"> // 第一个参数 需要操作的表名
// 第二个参数为 id+操作的下标 如果这里我们传入null,表示全部
删除
// 第三个参数默认传null即可
// -----------------------
sql
语句来
删除
// String DELETE_DATA = "DELETE FROM himi WHERE id=1";
// db.exec
sql
(DELETE_DATA);
tv.setText("
删除
数据成功!点击查看
数据库
查询
");
} else if (v == btn_check) {// 遍历数据
//备注4------
Cursor cur =
MysqL
.rawQuery("SELECT * FROM "
+
MysqL
iteOpenHelper.TABLE_NAME,serif; font-size:12px; line-height:1.8em"> if (cur != null) {
String temp = "";
int i = 0;
while (cur.moveToNext()) {//直到返回false说明表中到了数据末尾
temp += cur.getString(0);
// 参数0 指的是列的下标,这里的0指的是id列
temp += cur.getString(1);
// 这里的0相对于当前应该是咱们的text列了
i++;
temp += " "; // 这里是我整理
显示
格式,呵呵~
if (i % 3 == 0) // 这里是我整理
显示
格式,serif; font-size:12px; line-height:1.8em"> temp += "/n";// 这里是我整理
显示
格式,serif; font-size:12px; line-height:1.8em"> tv.setText(temp);
} else if (v == btn_edit) {//
修改
数据
// ------------------------句柄方式来
修改
-------------
修改后的数据");
MysqL
.update("himi",cv,"id " + "=" + Integer.toString(3),serif; font-size:12px; line-height:1.8em"> // ------------------------
sql
语句来
修改
-------------
// String UPDATA_DATA =
// "UPDATE himi SET text='通过
sql
语句来
修改
数据' WHERE id=1";
// db.exec
sql
(UPDATA_DATA);
tv.setText("
修改
数据成功!点击查看
数据库
查询
");
} else if (v == btn_deleteTable) {//
删除
表
MysqL
.exec
sql
("DROP TABLE himi");
tv.setText("
删除
表成功!点击查看
数据库
查询
");
} else if (v == btn_newTable) {// 新建表
String TABLE_NAME = "himi";
String ID = "id";
String TEXT = "text";
String str_
sql
2 = "CREATE TABLE " + TABLE_NAME + "(" + ID
+ " text );";
MysqL
.exec
sql
(str_
sql
2);
tv.setText("新建表成功!点击查看
数据库
查询
");
//
删除
数据库
:
// this.deleteDatabase("himi.db");
} catch (Exception e) {
tv.setText("操作失败!");
} finally {// 如果try中异常,也要对
数据库
进行
关闭
MysqL
.close();
以上
代码
中我们实现了两种存储方式:
一种存储默认系统路径/data-data-com.himi-databases下,另外一种则是保存在了/sdcard-himi下,
生成
数据库
文件
himi.db
那么这里两种实现方式大概步骤和区别说下:
-----------如果我们使用默认系统路径存储
数据库
文件
:
第一步:新建一个类继承
sql
iteOpenHelper;写一个构造,重写两个
函数
!
第二步:在新建的类中的onCreate(
sql
iteDatabase db)
方法
中创建一个表;
第三步:在进行
删除
数据、
添加
数据等操作的之前我们要得到
数据库
读写句柄得到一个
数据库
实例;
注意: 继承写这个辅助类,是为了在我们没有
数据库
的时候
自动
为我们
生成
一个
数据库
,并且
生成
数据库
文件
,这里也同时创建了一张表,因为我们在onCreate里是在
数据库
中创建一张表的操作;这里还要注意在我们new 这个我们这个
MysqL
iteOpenHelper 类实例对象的时候并没有创建
数据库
哟~!而是在我们
调用
(备注3)
MysqL
iteOpenHelper ..getWritableDatabase() 这个
方法
得到
数据库
读写句柄的时候,android 会分析是否已经有了
数据库
,如果没有会默认为我们创建一个
数据库
并且在系统路径data-data-com.himi-databases下
生成
himi.db
文件
!
(如果我们使用sd卡存储
数据库
文件
,就没有必要写这个类了,而是我们自己Open自己的
文件
得到一个
数据库
,西西,反而方便~ )
-----------如果我们需要把
数据库
文件
存储到SD卡中:
第一步:确认模拟器存在SD卡,关于SD卡的两种创建
方法
见我的博文:【Android 2D游戏开发之十】
第二步:(备注1)先创建SD卡目录和路径已经我们的
数据库
文件
!这里不像上面默认路径中的那样,如果没有
数据库
会默认系统路径
生成
一个
数据库
和一个
数据库
文件
!我们必须手动创建
数据库
文件
!
第三步:在进行
删除
数据、
添加
数据等操作的之前我们要得到
数据库
读写句柄得到一个
数据库
实例;(备注2)此时的创建也不是像系统默认创建,而是我们通过打开第一步创建好的
文件
得到
数据库
实例。这里仅仅是创建一个
数据库
!!!!
第四步:在进行
删除
数据、
添加
数据等操作的之前我们还要创建一个表!
第五步:在
配置文件
AndroidMainfest.xml 声明写入SD卡的权限,
上一篇
已经介绍权限了,不知道的自己去看下吧。
有些童鞋不理解什么默认路径方式中就有表?那是因为我们在它默认给我们创建
数据库
的时候我们有创建表的操作,就是
MysqL
iteOpenHelper类中的onCreate()
方法
里的操作!所以我们如果要在进行
删除
数据、
添加
数据等操作的之前还要创建一个表,创建表的
方法
都是一样的。
总结:不管哪种方式我们都要-创建
数据库
-创建表-然后进行操作!
备注4:
在Android中
查询
数据是通过Cursor类来实现的,当我们使用
sql
iteDatabase.query()
方法
时,会得到一个Cursor对象,Cursor指向的就是每一条数据。它提供了很多有关
查询
的
方法
,具体
方法
如下:
以下是
方法
和说明:
move以当前的位置为参考,将Cursor移动到指定的位置,成功返回true,失败返回false
moveToPosition将Cursor移动到指定的位置,成功返回true,Simsun; font-size:14px; line-height:21px"> moveToNext 将Cursor向前移动一个位置,成功返回true,Simsun; font-size:14px; line-height:21px"> moveToLast将Cursor向后移动一个位置,成功返回true,失败返回 false。
movetoFirst 将Cursor移动到第一行,成功返回true,Simsun; font-size:14px; line-height:21px"> isBeforeFirst返回Cursor是否指向第一项数据之前
isAfterLast 返回Cursor是否指向最后一项数据之后
isClosed 返回Cursor是否
关闭
isFirst返回Cursor是否指向第一项数据
isLast 返回Cursor是否指向最后一项数据
isNull 返回指定位置的值是否为null
getCount 返回总的数据项数
getInt 返回当前行中指定的索引数据
对于
sql
ite的很多童鞋有接触过,但是就不知道怎么存储在SD中,所以我也研究了下,这篇也写了把sd卡中的方式也提供给大家。
原文链接:https://www.f2er.com/sqlite/201537.html
上一篇:为SQLite数据库中某个字段的每一行
下一篇:Could not load file or assembly
猜你在找的Sqlite相关文章
SQLite学习笔记
安装 在Windows上安装SQLite。 访问官网下载下Precompliled Binaries for Windows的两个压...
作者:前端之家 时间:2021-01-12
windows上如何安装Sqlite
一、安装 下载地址:http://www.sqlite.org/download.html 将Precompiled Binaries for Wi...
作者:前端之家 时间:2020-11-05
【Android数据存储】SQLite使用实例(附源码)
实例: 会员信息管理 功能:1.查看数据库 2.清空数据库 3.增加会员 4.删除会员 5.更新会员 ...
作者:前端之家 时间:2020-08-07
SQLite数据库管理
作者:前端之家 时间:2020-08-07
SQLite3常用命令
作者:前端之家 时间:2020-08-07
加密你的SQLite
关于SQLite SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的在读写效率、消耗总量、...
作者:前端之家 时间:2020-08-07
SQLite这么娇小可爱,不多了解点都不行啊
在我眼里,MySQL和Oracle是这样的 而SQLite在是这样的 所以这么萌的数据库,我真的应该多了...
作者:前端之家 时间:2020-08-07
SQLite这么娇小可爱,不多了解点都不行啊
在我眼里,MySQL和Oracle是这样的 而SQLite在是这样的 所以这么萌的数据库,我真的应该多了...
作者:前端之家 时间:2020-08-07
SQLite 这么娇小可爱,不多了解点都不行啊
(点击上方蓝字,快速关注我们) 作者:空之境界 网址:http://supermao.cn/sqlitezhe-yao-...
作者:前端之家 时间:2020-08-07
SQLITE3 使用总结
SQLITE3 使用总结 投稿:hebedich 字体:[ 增加 减小] 类型:转载 时间:2014-08-19 Sql...
作者:前端之家 时间:2020-08-07
编程分类
MySQL
MsSQL
Oracle
Sqlite
Postgre SQL
Mariadb
MongoDB
NoSQL
HBase
JDBC
最新文章
• SQLite学习笔记
• windows上如何安装Sqlite
• 【Android数据存储】SQLit
• SQLite数据库管理
• SQLite3常用命令
• 加密你的SQLite
• 加密你的SQLite
• SQLite这么娇小可爱,不多
• SQLite这么娇小可爱,不多
• SQLite 这么娇小可爱,不多
热门标签
更多 ►
undo日志
persistent-c
mysql-error-
postal-code
sql-match-al
mysql-5.6
mysql-8.0
database-tri
安装路径
系统错误
data_dir
丢失文件
主从同步
sql_mode
数据库目录
匿名用户
character_se
ID归零
数据库位置
查询表
重复字段
查询字段
截断日志
SUSPECT
7391
Remote Serve
Linked Serve
玄学问题
登录不上
开启远程访问