【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中.doc_第1页
【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中.doc_第2页
【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中.doc_第3页
【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中.doc_第4页
【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中.doc_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Himi 原创, 欢迎转载,转载请在明显处注明! 谢谢。原文地址:/xiaominghimi/archive/2011/01/04/6114629.aspx上一篇跟各位童鞋介绍了SharedPreference 和 File流如何存储数据,并且推荐使用FileOutputStream/FileInputStream来存储咱们游戏数据,那么这一篇则是像大家介绍另外一种适合游戏数据存储的方式: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:view plaincopy to clipboardprint?1020304050607080901001101201301401501. 2. 5. 8. 10. 12. 14. 16. 18. 20. xml中定义了我们需要练习用到的几个操作按钮,这里不多解释了,下面看java源码:先看我们继承的SQLiteOpenHelper 类view plaincopy to clipboardprint?1020304050607080901001101201301401501. packagecom.himi;2. importandroid.content.Context;3. importandroid.database.sqlite.SQLiteDatabase;4. importandroid.database.sqlite.SQLiteOpenHelper;5. importandroid.util.Log;6. /*7. *8. *authorHimi9. *解释此类我们只需要传建一个构造函数以及重写两个方法就OK啦、10. *11. */12. publicclassMySQLiteOpenHelperextendsSQLiteOpenHelper13. publicfinalstaticintVERSION=1;/版本号14. publicfinalstaticStringTABLE_NAME=himi;/表名15. publicfinalstaticStringID=id;/后面ContentProvider使用16. publicfinalstaticStringTEXT=text;17. publicstaticfinalStringDATABASE_NAME=Himi.db;18. publicMySQLiteOpenHelper(Contextcontext)19. /在Android中创建和打开一个数据库都可以使用openOrCreateDatabase方法来实现,20. /因为它会自动去检测是否存在这个数据库,如果存在则打开,不过不存在则创建一个数据库;21. /创建成功则返回一个SQLiteDatabase对象,否则抛出异常FileNotFoundException。22. /下面是来创建一个名为DATABASE_NAME的数据库,并返回一个SQLiteDatabase对象23. 24. super(context,DATABASE_NAME,null,VERSION);25. 26. Override27. /在数据库第一次生成的时候会调用这个方法,一般我们在这个方法里边生成数据库表;28. publicvoidonCreate(SQLiteDatabasedb)29. Stringstr_sql=CREATETABLE+TABLE_NAME+(+ID30. +INTEGERPRIMARYKEYAUTOINCREMENT,+TEXT+text);31. /CREATETABLE创建一张表然后后面是我们的表名32. /然后表的列,第一个是id方便操作数据,int类型33. /PRIMARYKEY是指主键这是一个int型,用于唯一的标识一行;34. /AUTOINCREMENT表示数据库会为每条记录的key加一,确保记录的唯一性;35. /最后我加入一列文本String类型36. /-注意:这里str_sql是sql语句,类似dos命令,要注意空格!37. db.execSQL(str_sql);38. /execSQL()方法是执行一句sql语句39. /虽然此句我们生成了一张数据库表和包含该表的sql.himi文件,40. /但是要注意不是方法是创建,是传入的一句str_sql这句sql语句表示创建!41. 42. Override43. publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion)44. /一般默认情况下,当我们插入数据库就立即更新45. /当数据库需要升级的时候,Android系统会主动的调用这个方法。46. /一般我们在这个方法里边删除数据表,并建立新的数据表,47. /当然是否还需要做其他的操作,完全取决于游戏需求。48. Log.v(Himi,onUpgrade);49. 50. 我喜欢代码中立即附上解释,感觉这样代码比较让大家更容易理解和寻找,当然如果童鞋们不喜欢,可以告诉我,我改嘿嘿下面看最重要的MainActivity中的代码:view plaincopy to clipboardprint?1020304050607080901001101201301401501. packagecom.himi;2. importjava.io.File;3. importjava.io.IOException;4. importandroid.app.Activity;5. importandroid.content.ContentValues;6. importandroid.database.Cursor;7. importandroid.database.sqlite.SQLiteDatabase;8. importandroid.os.Bundle;9. importandroid.view.View;10. importandroid.view.Window;11. importandroid.view.WindowManager;12. importandroid.view.View.OnClickListener;13. importandroid.widget.Button;14. importandroid.widget.TextView;15. /-第三种保存方式-SQLite-16. /*17. *authorHimi18. *保存方式:SQLite轻量级数据库、19. *优点:可以将自己的数据存储到文件系统或者数据库当中,也可以将自己的数据存20. *储到SQLite数据库当中,还可以存到SD卡中21. *注意1:数据库对于一个游戏(一个应用)来说是私有的,并且在一个游戏当中,22. *数据库的名字也是唯一的。23. *注意2apk中创建的数据库外部的进程是没有权限去读/写的,24. *我们需要把数据库文件创建到sdcard上可以解决类似问题.25. *注意3当你删除id靠前的数据或者全部删除数据的时候,SQLite不会自动排序,26. *也就是说再添加数据的时候你不指定id那么SQLite默认还是在原有id最后添加一条新数据27. *注意4android中的SQLite语法区分大小写的!这点要注意!28. *StringUPDATA_DATA=UPDATEhimiSETtext=通过SQL语句来修改数据WHEREid=1;29. *千万不能可以写成30. *StringUPDATA_DATA=updatahimisettext=通过SQL语句来修改数据whereid=1;31. */32. publicclassMainActivityextendsActivityimplementsOnClickListener33. privateButtonbtn_addOne,btn_deleteone,btn_check,btn_deleteTable,34. btn_edit,btn_newTable;35. privateTextViewtv;36. privateMySQLiteOpenHelpermyOpenHelper;/创建一个继承SQLiteOpenHelper类实例37. privateSQLiteDatabasemysql;38. /-以下两个成员变量是针对在SD卡中存储数据库文件使用39. /privateFilepath=newFile(/sdcard/himi);/创建目录40. /privateFilef=newFile(/sdcard/himi/himi.db);/创建文件41. Override42. publicvoidonCreate(BundlesavedInstanceState)43. super.onCreate(savedInstanceState);44. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,45. WindowManager.LayoutParams.FLAG_FULLSCREEN);46. this.requestWindowFeature(Window.FEATURE_NO_TITLE);47. setContentView(R.layout.main);48. tv=(TextView)findViewById(R.id.tv_title);49. btn_addOne=(Button)findViewById(R.id.sql_addOne);50. btn_check=(Button)findViewById(R.id.sql_check);51. btn_deleteone=(Button)findViewById(R.id.sql_deleteOne);52. btn_deleteTable=(Button)findViewById(R.id.sql_deleteTable);53. btn_newTable=(Button)findViewById(R.id.sql_newTable);54. btn_edit=(Button)findViewById(R.id.sql_edit);55. btn_edit.setOnClickListener(this);56. btn_addOne.setOnClickListener(this);57. btn_check.setOnClickListener(this);58. btn_deleteone.setOnClickListener(this);59. btn_deleteTable.setOnClickListener(this);60. btn_newTable.setOnClickListener(this);61. myOpenHelper=newMySQLiteOpenHelper(this);/实例一个数据库辅助器62. /备注1-如果你使用的是将数据库的文件创建在SD卡中,那么创建数据库mysql如下操作:63. /if(!path.exists()/目录存在返回false64. /path.mkdirs();/创建一个目录65. /66. /if(!f.exists()/文件存在返回false67. /try68. /f.createNewFile();/创建文件69. /catch(IOExceptione)70. /TODOAuto-generatedcatchblock71. /e.printStackTrace();72. /73. /74. 75. Override76. publicvoidonClick(Viewv)77. try78. /备注2-如果你使用的是将数据库的文件创建在SD卡中,那么创建数据库mysql如下操作:79. /mysql=SQLiteDatabase.openOrCreateDatabase(f,null);80. /备注3-如果想把数据库文件默认放在系统中,那么创建数据库mysql如下操作:81. mysql=myOpenHelper.getWritableDatabase();/实例数据库82. if(v=btn_addOne)/添加数据83. /-读写句柄来插入-84. /ContentValues其实就是一个哈希表HashMap,key值是字段名称,85. /Value值是字段的值。然后通过ContentValues的put方法就可以86. /把数据放到ContentValues中,然后插入到表中去!87. ContentValuescv=newContentValues();88. cv.put(MySQLiteOpenHelper.TEXT,测试新的数据);89. mysql.insert(MySQLiteOpenHelper.TABLE_NAME,null,cv);90. /inser()第一个参数标识需要插入操作的表名91. /第二个参数:默认传null即可92. /第三个是插入的数据93. /-SQL语句插入-94. /StringINSERT_DATA=95. /INSERTINTOhimi(id,text)values(1,通过SQL语句插入);96. /db.execSQL(INSERT_DATA);97. tv.setText(添加数据成功!点击查看数据库查询);98. elseif(v=btn_deleteone)/删除数据99. /-读写句柄来删除100. mysql.delete(himi,MySQLiteOpenHelper.ID+=1,null);101. /第一个参数需要操作的表名102. /第二个参数为id+操作的下标如果这里我们传入null,表示全部删除103. /第三个参数默认传null即可104. /-SQL语句来删除105. /StringDELETE_DATA=DELETEFROMhimiWHEREid=1;106. /db.execSQL(DELETE_DATA);107. tv.setText(删除数据成功!点击查看数据库查询);108. elseif(v=btn_check)/遍历数据109. /备注4-110. Cursorcur=mysql.rawQuery(SELECT*FROM111. +MySQLiteOpenHelper.TABLE_NAME,null);112. if(cur!=null)113. Stringtemp=;114. inti=0;115. while(cur.moveToNext()/直到返回false说明表中到了数据末尾116. temp+=cur.getString(0);117. /参数0指的是列的下标,这里的0指的是id列118. temp+=cur.getString(1);119. /这里的0相对于当前应该是咱们的text列了120. i+;121. temp+=;/这里是我整理显示格式,呵呵122. if(i%3=0)/这里是我整理显示格式,呵呵123. temp+=n;/这里是我整理显示格式,呵呵124. 125. tv.setText(temp);126. 127. elseif(v=btn_edit)/修改数据128. /-句柄方式来修改-129. ContentValuescv=newContentValues();130. cv.put(MySQLiteOpenHelper.TEXT,修改后的数据);131. mysql.update(himi,cv,id+=+Integer.toString(3),null);132. /-SQL语句来修改-133. /StringUPDATA_DATA=134. /UPDATEhimiSETtext=通过SQL语句来修改数据WHEREid=1;135. /db.execSQL(UPDATA_DATA);136. tv.setText(修改数据成功!点击查看数据库查询);137. elseif(v=btn_deleteTable)/删除表138. mysql.execSQL(DROPTABLEhimi);139. tv.setText(删除表成功!点击查看数据库查询);140. elseif(v=btn_newTable)/新建表141. StringTABLE_NAME=himi;142. StringID=id;143. StringTEXT=text;144. Stringstr_sql2=CREATETABLE+TABLE_NAME+(+ID145. +INTEGERPRIMARYKEYAUTOINCREMENT,+TEXT146. +text);147. mysql.execSQL(str_sql2);148. tv.setText(新建表成功!点击查看数据库查询);149. 150. /删除数据库:151. /this.deleteDatabase(himi.db);152. catch(Exceptione)153. tv.setText(操作失败!);154. finally/如果try中异常,也要对数据库进行关闭155. mysql.close();156. 157. 158. 以上代码中我们实现了两种存储方式: 一种存储默认系统路径/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)此时的创建也不是像系统默认创建,而是我们通过打开第一步创建好的文件得到

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论