详解Andorid下SQLite存储方式(Himi)

详解Andorid下SQLite存储方式(Himi),第1张

概述先介绍几个基本概念知识: 什么是SQLite: SQLite是一款轻量级数据库,它的设计目的是嵌入式,而且它占用的资源非常少,在嵌入式设备中,只需要几百KB!!!!! SQLite的特性: 轻量级 使用 SQLite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小。 独立性 SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。 隔离性 SQLite

先介绍几个基本概念知识:

什么是sqlite:

sqlite是一款轻量级数据库,它的设计目的是嵌入式,而且它占用的资源非常少,在嵌入式设备中,只需要几百KB!!!!!

sqlite的特性:

轻量级
使用 sqlite 只需要带一个动态库,就可以享受它的全部功能,而且那个动态库的尺寸想当小。
独立性
sqlite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。
隔离性
sqlite 数据库中所有的信息(比如表、视图、触发器等)都包含在一个文件夹内,方便管理和维护。
跨平台
sqlite 目前支持大部分 *** 作系统,不至电脑 *** 作系统更在众多的手机系统也是能够运行,比如:AndroID。
多语言接口
sqlite 数据库支持多语言编程接口。
安全性
sqlite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只能有一个可以写入数据.

优点:1.能存储较多的数据。

2.能将数据库文件存放到SD卡中!

什么是 sqliteDatabase?

一个 sqliteDatabase 的实例代表了一个sqlite 的数据库,通过sqliteDatabase 实例的一些方法,我们可以执行sql 语句,对数 据库进行增、删、查、改的 *** 作。需要注意的是,数据库对于一个应用来说是私有的,并且在一个应用当中,数据库的名字也是惟一的。

什么是 sqliteOpenHelper ?

根据这名字,我们可以看出这个类是一个辅助类。这个类主要生成一个数据库,并对数据库的版本进行管理。当在程序当中调用这个类的 方法getWritableDatabase(),或者getReadableDatabase()方法的时候,如果当时没有数据,那么AndroID 系统就会自动生成一 个数 据库。sqliteOpenHelper 是一个抽象类,我们通常需要继承它,并且实现里边的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源码:先看我们继承的sqliteOpenHelper 类

package com.himi;import androID.content.Context;import androID.database.sqlite.sqliteDatabase;import androID.database.sqlite.sqliteOpenHelper;import androID.util.Log;/** *  * @author Himi * @解释 此类我们只需要传建一个构造函数 以及重写两个方法就OK啦、 *  */public class MysqLiteOpenHelper extends sqliteOpenHelper { 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 MysqLiteOpenHelper(Context context) {  // 在AndroID 中创建和打开一个数据库都可以使用openorCreateDatabase 方法来实现,  // 因为它会自动去检测是否存在这个数据库,如果存在则打开,不过不存在则创建一个数据库;  // 创建成功则返回一个 sqliteDatabase对象,否则抛出异常fileNotFoundException。  // 下面是来创建一个名为"DATABASE_name"的数据库,并返回一个sqliteDatabase对象    super(context,DATABASE_name,null,VERSION);  }  @OverrIDe // 在数据库第一次生成的时候会调用这个方法,一般我们在这个方法里边生成数据库表; public voID onCreate(sqliteDatabase 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.execsql(str_sql);  // execsql()方法是执行一句SQL语句  // 虽然此句我们生成了一张数据库表和包含该表的sql.himi文件,// 但是要注意 不是方法是创建,是传入的一句str_sql这句SQL语句表示创建!! } @OverrIDe public voID onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {  // 一般默认情况下,当我们插入 数据库就立即更新  // 当数据库需要升级的时候,AndroID 系统会主动的调用这个方法。  // 一般我们在这个方法里边删除数据表,并建立新的数据表,  // 当然是否还需要做其他的 *** 作,完全取决于游戏需求。  Log.v("Himi","onUpgrade"); } }


我喜欢代码中立即附上解释,感觉这样代码比较让大家更容易理解和寻找,当然如果童鞋们不喜欢,可以告诉我,我改~嘿嘿~

下面看最重要的MainActivity中的代码:

package com.himi;import java.io.file;import java.io.IOException;import androID.app.Activity;import androID.content.ContentValues;import androID.database.Cursor;import androID.database.sqlite.sqliteDatabase;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;// ------------第三种保存方式--------《sqlite》---------/** * @author Himi * @保存方式:sqlite 轻量级数据库、 * @优点: 可以将自己的数据存储到文件系统或者数据库当中, 也可以将自己的数据存 *         储到sqlite数据库当中,还可以存到SD卡中 * @注意1:数据库对于一个游戏(一个应用)来说是私有的,并且在一个游戏当中,  *         数据库的名字也是唯一的。 * @注意2 apk中创建的数据库外部的进程是没有权限去读/写的,*         我们需要把数据库文件创建到sdcard上可以解决类似问题. * @注意3 当你删除ID靠前的数据或者全部删除数据的时候,sqlite不会自动排序, *        也就是说再添加数据的时候你不指定ID那么sqlite默认还是在原有ID最后添加一条新数据 * @注意4 androID 中 的sqlite 语法区分大小写的!!!!!这点要注意! *   String UPDATA_DATA = "UPDATE himi SET text='通过SQL语句来修改数据'  WHERE ID=1";  *                  千万 不能可以写成 *   String UPDATA_DATA = "updata himi set text='通过SQL语句来修改数据'  where ID=1"; */public class MainActivity extends Activity implements OnClickListener { private button btn_addOne,btn_deleteone,btn_check,btn_deletetable,btn_edit,btn_newtable; private TextVIEw tv; private MysqLiteOpenHelper myOpenHelper;// 创建一个继承sqliteOpenHelper类实例 private sqliteDatabase MysqL ; //---------------以下两个成员变量是针对在SD卡中存储数据库文件使用// private file path = new file("/sdcard/himi");// 创建目录// private file f = new file("/sdcard/himi/himi.db");// 创建文件 @OverrIDe public voID onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  getwindow().setFlags(WindowManager.LayoutParams.FLAG_FulLSCREEN,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 MysqLiteOpenHelper(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();//   }//  }  } @OverrIDe public voID onClick(VIEw v) {    try { //备注2----如果你使用的是将数据库的文件创建在SD卡中,那么创建数据库MysqL如下 *** 作://       MysqL = sqliteDatabase.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(MysqLiteOpenHelper.TEXT,"测试新的数据");    MysqL.insert(MysqLiteOpenHelper.table_name,cv);    // inser() 第一个参数 标识需要插入 *** 作的表名    // 第二个参数 :默认传null即可    // 第三个是插入的数据    // ---------------------- SQL语句插入--------------    // String INSERT_DATA =    // "INSERT INTO himi (ID,text) values (1,'通过SQL语句插入')";    // db.execsql(INSERT_DATA);    tv.setText("添加数据成功!点击查看数据库查询");   } else if (v == btn_deleteone) {// 删除数据    // ---------------------- 读写句柄来删除    MysqL.delete("himi",MysqLiteOpenHelper.ID + "=1",null);    // 第一个参数 需要 *** 作的表名    // 第二个参数为 ID+ *** 作的下标 如果这里我们传入null,表示全部删除    // 第三个参数默认传null即可    // ----------------------- SQL语句来删除    // String DELETE_DATA = "DELETE FROM himi WHERE ID=1";    // db.execsql(DELETE_DATA);    tv.setText("删除数据成功!点击查看数据库查询");   } else if (v == btn_check) {// 遍历数据//备注4------    Cursor cur = MysqL.rawquery("SELECT * FROM "      + MysqLiteOpenHelper.table_name,null);    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) // 这里是我整理显示格式,呵呵~       temp += "\n";// 这里是我整理显示格式,呵呵~     }     tv.setText(temp);    }   } else if (v == btn_edit) {// 修改数据    // ------------------------句柄方式来修改 -------------    ContentValues cv = new ContentValues();    cv.put(MysqLiteOpenHelper.TEXT,"修改后的数据");    MysqL.update("himi",cv,"ID " + "=" + Integer.toString(3),null);    // ------------------------SQL语句来修改 -------------    // String UPDATA_DATA =    // "UPDATE himi SET text='通过SQL语句来修改数据'  WHERE ID=1";    // db.execsql(UPDATA_DATA);    tv.setText("修改数据成功!点击查看数据库查询");   } else if (v == btn_deletetable) {// 删除表    MysqL.execsql("DROP table himi");    tv.setText("删除表成功!点击查看数据库查询");   } else if (v == btn_newtable) {// 新建表    String table_name = "himi";    String ID = "ID";    String TEXT = "text";    String str_sql2 = "CREATE table " + table_name + "(" + ID      + " INTEGER PRIMARY KEY autoINCREMENT," + TEXT      + " text );";    MysqL.execsql(str_sql2);    tv.setText("新建表成功!点击查看数据库查询");   }   // 删除数据库:   // this.deleteDatabase("himi.db");  } catch (Exception e) {   tv.setText(" *** 作失败!");  } finally {// 如果try中异常,也要对数据库进行关闭   MysqL.close();  } }}


以上代码中我们实现了两种存储方式:

一种存储默认系统路径/data-data-com.himi-databases下,另外一种则是保存在了/sdcard-himi下,生成数据库文件himi.db

那么这里两种实现方式大概步骤和区别说下:

———–如果我们使用默认系统路径存储数据库文件:

第一步:新建一个类继承sqliteOpenHelper;写一个构造,重写两个函数!

第二步:在新建的类中的onCreate(sqliteDatabase db) 方法中创建一个表;

第三步:在进行删除数据、添加数据等 *** 作的之前我们要得到数据库读写句柄得到一个数据库实例;

注意: 继承写这个辅助类,是为了在我们没有数据库的时候自动为我们生成一个数据库,并且生成数据库文件,这里也同时创建了一张表,因为我们在onCreate里是在数据库中创建一张表的 *** 作;这里还要注意在我们new 这个我们这个MysqLiteOpenHelper 类实例对象的时候并没有创建数据库哟~!而是在我们调用(备注3)MysqLiteOpenHelper ..getWritableDatabase() 这个方法得到数据库读写句柄的时候,androID 会分析是否已经有了数据库,如果没有会默认为我们创建一个数据库并且在系统路径data-data-com.himi-databases下生成himi.db 文件!

(如果我们使用sd卡存储数据库文件,就没有必要写这个类了,而是我们自己Open自己的文件得到一个数据库,西西,反而方便~ )

———–如果我们需要把数据库文件存储到SD卡中:

第一步:确认模拟器存在SD卡,关于SD卡的两种创建方法见我的博文:【AndroID 2D游戏开发之十】

第二步:(备注1)先创建SD卡目录和路径已经我们的数据库文件!这里不像上面默认路径中的那样,如果没有数据库会默认系统路径生成一个数据库和一个数据库文件!我们必须手动创建数据库文件!

第三步:在进行删除数据、添加数据等 *** 作的之前我们要得到数据库读写句柄得到一个数据库实例;(备注2)此时的创建也不是像系统默认创建,而是我们通过打开第一步创建好的文件得到数据库实例。这里仅仅是创建一个数据库!!!!

第四步:在进行删除数据、添加数据等 *** 作的之前我们还要创建一个表!

第五步:在配置文件AndroIDMainfest.xml 声明写入SD卡的权限,上一篇已经介绍权限了,不知道的自己去看下吧。

有些童鞋不理解什么默认路径方式中就有表?那是因为我们在它默认给我们创建数据库的时候我们有创建表的 *** 作,就是MysqLiteOpenHelper类中的onCreate()方法里的 *** 作!所以我们如果要在进行删除数据、添加数据等 *** 作的之前还要创建一个表,创建表的方法都是一样的。

总结:不管哪种方式我们都要-创建数据库-创建表-然后进行 *** 作!

备注4:

在AndroID中查询数据是通过Cursor类来实现的,当我们使用sqliteDatabase.query()方法时,会得到一个Cursor对象,Cursor指向的就是每一条数据。它提供了很多有关查询的方法,具体方法如下:

以下是方法和说明:

move 以当前的位置为参考,将Cursor移动到指定的位置,成功返回true,失败返回false

movetoposition 将Cursor移动到指定的位置,成功返回true,失败返回false

movetoNext 将Cursor向前移动一个位置,成功返回true,失败返回false

movetoLast 将Cursor向后移动一个位置,成功返回true,失败返回 false。

movetoFirst 将Cursor移动到第一行,成功返回true,失败返回false

isBeforeFirst 返回Cursor是否指向第一项数据之前

isAfterLast 返回Cursor是否指向最后一项数据之后

isClosed 返回Cursor是否关闭

isFirst 返回Cursor是否指向第一项数据

isLast 返回Cursor是否指向最后一项数据

isNull 返回指定位置的值是否为null

getCount 返回总的数据项数

getInt 返回当前行中指定的索引数据

总结

以上是内存溢出为你收集整理的详解Andorid下SQLite存储方式(Himi)全部内容,希望文章能够帮你解决详解Andorid下SQLite存储方式(Himi)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1176143.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存