(保存游戏数据 [下文])详解SQLITE存储方式 并把SQLITE的数据库文件...
2023年7月15日发(作者:)
对于游戏中的数据进行保存方式,在Android中常用的有四种保存方式,这里我先给大家统一先简单的介绍下:Preference此保存方式试用于简单数据的保存,文如其名属于配置性质的保存,不适合数据比较大的保存方式;2.文件存储(FIleInputStream/FileOutputStream)此保存方式比较适合游戏的保存和使用,可以保存较大的数据,因为相对于SQLite来说更容易让童鞋们接受,此方式不仅能把数据存储在系统中也能将数据保存到SDcard中;此保存方式比较适合游戏的保存和使用,可以保存较大的数据,并且可以将自己的数据存储到文件系统或者数据库当中,也可以将自己的数据存储到SQLite数据库当中,也能将数据保存到SDcard中;tProvider(不推荐用于游戏保存)此保存方式不推荐用于游戏保存,因为此方式不仅能存储较大数据,还支持多个程序之间就的数据进行交换!!!但是由于游戏中基本就不可能去访问外部应用的数据,所以对于此方式我不予讲解,有兴趣的可以去自行百度google学习;以上简单的对几种常用的保存方式进行的概述,那么,下面会详细的去分析每个的优缺点以及每种保存的实现和需要注意的地方!下面我首先向大家介绍第一种保存方式:保存方式之:《SharedPreference》优点:简单、方便、适合简单数据的快速保存缺点:1.存数的文件只能在同一包内使用,不能在不同包之间使用!2.默认将数据存放在系统路径下/data/data//,没有找到放SD卡上的方法。总结:其实本保存方式如同它的名字一样是个配置保存,虽然方便,但只适合存储比较简单的数据!:[xhtml:showcolumns]viewplaincopyprint?·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······1501.2.5. 8. 10.13. 15.18.20.23. * @author Himi
* @保存方式:SharedPreference
* @注意:SharedPreference 可以跨程序包使用,多谢二楼 * @操作模式: _PRIVATE:新内容覆盖原内容
* _APPEND:新内容追加到原内容 * _WORLD_READABLE:允许其他应 * _WORLD_WRITEABLE:允许其他 */
public class MainActivity extends Activity implemen private EditText et_login, et_password;
private Button btn_save;
private TextView tv_title;
private SharedPreferences sp;
@Override
public void onCreate(Bundle savedInstanceState) te(savedInstanceState);
getWindow().setFlags(Pa代码中的注释的很清楚了,比较简单,不多说了。保存方式之:《文件存储OutputStream/InputStream》优点:1.适合游戏存储,能存储较大数据;2.不仅能存储到系统中,也能存储到SD卡中!总结:如果童鞋们对SQL不太熟习的话那么选择此种方式最为合适的啦、嘿嘿[java:showcolumns]viewplaincopyprint?·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······1501./**2.*@authorHimi3.*@保存方式:Stream数据流方式4.*@注意1:默认情况下,使用openFileOutput方法创建的文件只能被其调用的应用使用,5.*其他应用无法读取这个文件,如果需要在不同的应用中共享数据;6.*7.*@注意2:因为androidos内部闪存有限,所以适合保存较少的数据,当然我们也有解决的方法,8.*就是把数据保存在SD开中,这样就可以了,后面我也会向大家讲解!9.*10.*@提醒1调用FileOutputStream时指定的文件不存在,Android会自动创建它。11.*另外,在默认情况下,写入的时候会覆盖原文件内容,如果想把新写入的内12.*容附加到原文件内容后,则可以指定其mode为_APPEND。13.*14.*@提醒2启动程序就初始化的时候一定要注意处理!代码中有注释!一定要仔细看!15.*16.*@提醒3这里我给大家讲两种方式,一种是原生态file流来写入/读入,17.*另外一种是用Data流包装file流进行写入/读入其实用data流来包装进行操作;18.*原因是:包装后支持了更多的写入/读入操作,比如:file流写入不支持19.*writeUTF(Stringstr);但是用Data包装后就会支持。20.*21.*@操作模式:_PRIVATE:新内容覆盖原内容22.*_APPEND:新内容追加到原内容后23.*_WORLD_READABLE:允许其他应用程序读取24.*_WORLD_WRITEABLE:允许其他应用程序写入,会覆盖原数据。25.*/classMainActivityextendsActivityimplementsOnClickListener{eEditTextet_login,et_password;eButtonbtn_save;eTextViewtv_title;eFileOutputStreamfos;eFileInputStreamfis;eDataOutputStreamdos;eDataInputStreamdis;34.@voidonCreate(BundlesavedInstanceState){temp=null;te(savedInstanceState);dow().setFlags(_FULLSCREEN,_FULLSCREEN);tWindowFeature(E_NO_TITLE);tentView();_save=(Button)findViewById(_save);_lickListener(this);_login=(EditText)findViewById(xt_Login);_password=(EditText)findViewById(xt_Password);_title=(TextView)findViewById(_title);{48.//openFileInput不像sharedPreference中49.//getSharedPreferences的方法那样找不到会返回默认值,50.//这里找不到数据文件就会报异常,所以finally里关闭流尤为重要!!!(leInput("")!=null){52.//--------------单纯用file来读入的方式-----------------53.//fis=leInput("");54.//ByteArrayOutputStreambyteArray=new55.//ByteArrayOutputStream();56.//byte[]buffer=newbyte[1024];57.//intlen=0;58.//while((len=(buffer))>0){59.//(buffer,0,len);60.//}61.//temp=ng();62.//--------------用data流包装后的读入的方式------------=leInput("");//备注=newDataInputStream(fis);_t(F());_t(F());67.//这里也是在刚启动程序的时候去读入存储的数据68.//读的时候要注意顺序;例如我们写入数据的时候69.//先写的字符串类型,我们也要先读取字符串类型,一一对应!70.}71.}catch(FileNotFoundExceptione){72.//tackTrace();74.}catch(IOExceptione){75.//tackTrace();77.}finally{78.//在finally中关闭流!因为如果找不到数据就会异常我们也能对其进行关闭操作;{(leInput("")!=null){81.//这里也要判断,因为找不到的情况下,两种流也不会实例化。82.//既然没有实例化,还去调用close关闭它,肯定"空指针"异常!!!();84.}85.}catch(FileNotFoundExceptione){86.//tackTrace();88.}catch(IOExceptione){89.//tackTrace();91.}92.}93.}94.@voidonClick(Viewv){(ernalStorageState()!=null){97.//这个方法在试探终端是否有sdcard!.v("Himi","有SD卡");99.}(v==btn_save){(et_t().toString().equals(""))_t("请输入帐号!");(et_t().toString().equals(""))_t("请输入密码!");{{107.//------单纯用file来写入的方式--------------108.//fos=newFileOutputStream(f);109.//(et_t().toString().getBytes());110.//(et_t().toString().getBytes());111.//------data包装后来写入的方式--------------=leOutput("",MODE_PRIVATE);//备注=newDataOutputStream(fos);TF(et_t().toString());TF(et_t().toString());_t("保存成功!可重新打开此程序,测试是"+117."否已经保存数据!/n(或者在'FileExplorer'"+118."窗口下--files路径下"+119."是否存在了'')");120.}catch(FileNotFoundExceptione){121.//tackTrace();123.}catch(IOExceptione){124.//tackTrace();126.}finally{127.//在finally中关闭流这样即使try中有异常我们也能对其进行关闭操作;{();();131.}catch(IOExceptione){132.//tackTrace();134.}135.}136.}137.}138.}139.}/** * @author Himi * @保存方式:Stream 数据流方式 * @注意1:默认情况下,使用openFileOutput 方法创建的文 * 其他应用无法读取这个文件,如果需要在不同的应 *
* @注意2:因为android os内部闪存有限,所以适合保存较 * 就是把数据保存在SD开中,这样就可以了,后面我 *
* @提醒1 调用FileOutputStream 时指定的文件不存在,An * 另外,在默认情况下,写入的时候会覆盖原 文件内 * 容附加到原文件内容后,则可以指定其mode为Cont *
* @提醒2 启动程序就初始化的时候一定要注意处理!代码中有 *
* @提醒3 这里我给大家讲两种方式,一种是原生态file流来 * 另外一种是用Data流包装file流进行写入/读入 其 * 原因是:包装后支持了更多的写入/读入操作,比如以上代码中实现了两种流形式来完成写入和读入,这里我们为什么要使用Data流来包装,其实不光是获得更多的操作方式,最主要的是方便快捷,你比如用file来读入的时候,明显的复杂了一些不说,它还一次性把所有数据都取出来了,不便于对数据的处理!强调的有几点:1:在一开始对数据的访问再次提醒童鞋们,这个跟sharedPreference的获取方式不一样,sharedPreference的获取方式可以得到一个默认的值,但是你用咱们获取的是个文件而且直接就去open这个文件,一旦不存在必定异常,所以这一块的异常处理,以及finally的处理一定要处理得当。2.其实在一开始用data包装的时候发现写入的字符串在读入的时候发现字符乱码了,查了api才发现,api规定当写入字符串的时候必须写入UTF-8格式的编码,但是后来不知道怎么了就没事了。--、所以这里如果童鞋们遇到此问题,我给出大家一个解决方法,就是在写入的时候我们不要去DataOutputStream来包装而是用,OutputStreamWriter,因为在构造的可以设定编码!OutputStreamWriterosw=newOutputStreamWriter(fis,"UTF-8");Stringcontent=ing(buffer,"UTF-8");这个也能把字符数组转码制!这样写入的就肯定是UTF-8编码的字符啦、下面介绍如何把我们的数据通过OutputStream/InputStream存入SD卡中!其实将我们的数据放入SD卡中,无疑就需要对代码进行两处的修改:注意:一定要有SD卡!对于如何创建SD卡在前一篇文章中已经说了两种方式,不会的童鞋可以去看下;第一:检查是否装有SD卡;第二:修改读入的地方(备注1)fis=leInput("");//这里没有路径,路径是默认的-files下替换成我们的SD卡的路径就可以了:Filepath=newFile("/sdcard/himi/");//这里新建一个File目录路径fis=newFileInputStream(path);传入路径第三:修改写入的地方(备注2)fos=leOutput("",MODE_PRIVATE);这里也是默认路径,需要对其修改,注意:这里修改了,那么在finally中的判定大家也要对应的适当修改;注意:如果是系统路径,当没有此文件的时候,android会默认创建一个!但是我们放入SD卡的时候要自己创建目录路径和文件![java:showcolumns]viewplaincopyprint?·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······(ernalStorageState()!=null){//这个方法在试探终端是否有sdcard!.v("Himi","有SD卡");th=newFile("/sdcard/himi");//创建目录=newFile("/sdcard/himi/");//创建文件(!()){//目录不存在返回();//创建一个目录7.}(!()){//文件不存在返回NewFile();//创建一个文件10.}=newFileOutputStream(f);//将数据存入sd卡中12.}if (ernalStorageState() != null)
Log.v("Himi", "有SDFile path = new FilFile f = new File("if (!())}if (!()) {/New}fos = new FileOutpu}第四:因为我们要在SD卡中进行写入的操作,所以要在配置文件中声明权限![xhtml:showcolumns]viewplaincopyprint?·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······1501.2.6.7.9.10. 11. 12. 13.14.15. 16. 17.
这一句就是啦~ 为了让大家看到所放的位置,所以把整个xml放出来供参考;那么当创建路径和文件的时候,我们对其检查SD卡中是否已经存在exists()方法,如果已经存在就不去创建,这样避免下次再次写入数据的时候又新建了文件和路径、其实我们在可以在启动程序的时候判断如果没有此文件,我们可以直接紧接着创建一个文件,这些都属于优化上的了,我主要是让大家引入,学会,那么其他的简化啦,优化啦,其他方式去实现啦都留给各位同学自己了、很多童鞋说我的代码运行后,点击home或者back后会程序异常,如果你也这样遇到过,那么你肯定没有仔细读完Himi的博文,第十九篇Himi专门写了关于这些错误的原因和解决方法,这里我在博客都补充说明下,省的童鞋们总疑惑这一块;请点击下面联系进入阅读:【Android游戏开发十九】(必看篇)SurfaceView运行机制详解—剖析Back与Home按键及切入后台等异常处理!上一篇跟各位童鞋介绍了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:[xhtml:showcolumns]viewplaincopyprint?·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······1501.2.5. 8.
10.12.14.16.18.20. * @author Himi * @解释 此类我们只需要传建一个构造函数 以及重写两个方法 *
*/public class MySQLiteOpenHelper extends SQLiteOpenHpublic final static int VERSION = 1;// 版本public final static String TABLE_NAME = "hipublic final static String ID = "id";// 后面public final static String TEXT = "text";public static final String DATABASE_NAME =
public MySQLiteOpenHelper(Context context)
感觉这样代码比较让大家更容易理解和寻找,当然如果童鞋们不我喜欢代码中立即附上解释,喜欢,可以告诉我,我改~嘿嘿~下面看最重要的MainActivity中的代码:[java:showcolumns]viewplaincopyprint?·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······;;ption;ty;tValues;;Database;;;;Manager;kListener;;ew;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.*29.*/classMainActivityextendsActivityimplementsOnClickListener{eButtonbtn_addOne,btn_deleteone,btn_check,btn_deleteTable,_edit,btn_newTable;eTextViewtv;eMySQLiteOpenHelpermyOpenHelper;//创建一个继承SQLiteOpenHelper类实例eSQLiteDatabasemysql;36.//---------------以下两个成员变量是针对在SD卡中存储数据库文件使用37.//privateFilepath=newFile("/sdcard/himi");//创建目录38.//privateFilef=newFile("/sdcard/himi/");//创建文件39.@voidonCreate(BundlesavedInstanceState){te(savedInstanceState);dow().setFlags(_FULLSCREEN,_FULLSCREEN);tWindowFeature(E_NO_TITLE);tentView();=(TextView)findViewById(_title);_addOne=(Button)findViewById(_addOne);_check=(Button)findViewById(_check);_deleteone=(Button)findViewById(_deleteOne);_deleteTable=(Button)findViewById(_deleteTable);_newTable=(Button)findViewById(_newTable);_edit=(Button)findViewById(_edit);_lickListener(this);_lickListener(this);_lickListener(this);_lickListener(this);_lickListener(this);_lickListener(this);Helper=newMySQLiteOpenHelper(this);//实例一个数据库辅助器60.//备注1----如果你使用的是将数据库的文件创建在SD卡中,那么创建数据库mysql如下操作:61.//if(!()){//目录存在返回false62.//();//创建一个目录63.//}64.//if(!()){//文件存在返回false65.//try{66.//NewFile();//创建文件67.//}catch(IOExceptione){68.////TODOAuto-generatedcatchblock69.//tackTrace();70.//}71.//}72.}73.@voidonClick(Viewv){{76.//备注2----如果你使用的是将数据库的文件创建在SD卡中,那么创建数据库mysql如下操作:77.//mysql=CreateDatabase(f,null);78.//备注3---如果想把数据库文件默认放在系统中,那么创建数据库mysql如下操作:=tableDatabase();//实例数据库(v==btn_addOne){//添加数据81.//----------------------读写句柄来插入---------82.//ContentValues其实就是一个哈希表HashMap,key值是字段名称,83.//Value值是字段的值。然后通过ContentValues的put方法就可以84.//把数据放到ContentValues中,然后插入到表中去!tValuescv=newContentValues();(,"测试新的数据");(_NAME,null,cv);88.//inser()第一个参数标识需要插入操作的表名89.//第二个参数:默认传null即可90.//第三个是插入的数据91.//----------------------SQL语句插入--------------92.//StringINSERT_DATA=93.//"INSERTINTOhimi(id,text)values(1,'通过SQL语句插入')";94.//L(INSERT_DATA);t("添加数据成功!点击查看数据库查询");96.}elseif(v==btn_deleteone){//删除数据97.//----------------------读写句柄来删除("himi",+"=1",null);99.//第一个参数需要操作的表名100.//第二个参数为id+操作的下标如果这里我们传入null,表示全部删除101.102.103.104.105.106.107.108.109.110.111.112.113.114.115.116.117.118.119.120.121.122.123.124.125.126.127.128.129.130.131.132.133.134.135.//第三个参数默认传null即可//-----------------------SQL语句来删除//StringDELETE_DATA="DELETEFROMhimiWHEREid=1";//L(DELETE_DATA);t("删除数据成功!点击查看数据库查询");}elseif(v==btn_check){//遍历数据//备注4------Cursorcur=ry("SELECT*FROM"+_NAME,null);if(cur!=null){Stringtemp="";inti=0;while(Next()){//直到返回false说明表中到了数据末尾temp+=ing(0);//参数0指的是列的下标,这里的0指的是id列temp+=ing(1);//这里的0相对于当前应该是咱们的text列了i++;temp+="";//这里是我整理显示格式,呵呵~if(i%3==0)//这里是我整理显示格式,呵呵~temp+="/n";//这里是我整理显示格式,呵呵~}t(temp);}}elseif(v==btn_edit){//修改数据//------------------------句柄方式来修改-------------ContentValuescv=newContentValues();(,"修改后的数据");("himi",cv,"id"+"="+ng(3),null);//------------------------SQL语句来修改-------------//StringUPDATA_DATA=//"UPDATEhimiSETtext='通过SQL语句来修改数据'WHEREid=1";//L(UPDATA_DATA);t("修改数据成功!点击查看数据库查询");}elseif(v==btn_deleteTable){//删除表L("DROPTABLEhimi");t("删除表成功!点击查看数据库查询");}elseif(v==btn_newTable){//新建表StringTABLE_NAME="himi";StringID="id";StringTEXT="text";Stringstr_sql2="CREATETABLE"+TABLE_NAME+"("+ID+"INTEGERPRIMARYKEYAUTOINCREMENT,"+TEXT+"text);";L(str_sql2);t("新建表成功!点击查看数据库查询");}//删除数据库://Database("");}catch(Exceptione){t("操作失败!");}finally{//如果try中异常,也要对数据库进行关闭();}}}package ;import ;import ption;import ty;import tValues;import ;import Database;import ;import ;import ;import Manager;import kListener;import ;import ew;// ------------第三种保存方式--------《SQLite》-----/** * @author Himi * @保存方式:SQLite 轻量级数据库、以上代码中我们实现了两种存储方式:一种存储默认系统路径/-databases下,另外一种则是保存在了/sdcard-himi下,生成数据库文件那么这里两种实现方式大概步骤和区别说下:-----------如果我们使用默认系统路径存储数据库文件:第一步:新建一个类继承SQLiteOpenHelper;写一个构造,重写两个函数!第二步:在新建的类中的onCreate(SQLiteDatabasedb)方法中创建一个表;第三步:在进行删除数据、添加数据等操作的之前我们要得到数据库读写句柄得到一个数据库实例;注意:继承写这个辅助类,是为了在我们没有数据库的时候自动为我们生成一个数据库,并且生成数据库文件,这里也同时创建了一张表,因为我们在onCreate里是在数据库中创建一张表的操作;这里还要注意在我们new这个我们这个MySQLiteOpenHelper类实例对象的时候并没有创建数据库哟~!而是在我们调用(备注WritableDatabase()这个方法得到数据库读写句柄的时候,android会分析是否已经有了数据库,如果没有会默认为我们创建一个数据库并且在系统路径-databases下生成文件!(如果我们使用sd卡存储数据库文件,就没有必要写这个类了,而是我们自己Open自己的文件得到一个数据库,西西,反而方便~)-----------如果我们需要把数据库文件存储到SD卡中:第一步:确认模拟器存在SD卡,关于SD卡的两种创建方法见我的博文:【Android2D游戏开发之十】第二步:(备注1)先创建SD卡目录和路径已经我们的数据库文件!这里不像上面默认路径中的那样,如果没有数据库会默认系统路径生成一个数据库和一个数据库文件!我们必须手动创建数据库文件!第三步:在进行删除数据、添加数据等操作的之前我们要得到数据库读写句柄得到一个数据库实例;(备注2)此时的创建也不是像系统默认创建,而是我们通过打开第一步创建好的文件得到数据库实例。这里仅仅是创建一个数据库!!!!第四步:在进行删除数据、添加数据等操作的之前我们还要创建一个表!第五步:在配置文件声明写入SD卡的权限,上一篇已经介绍权限了,不知道的自己去看下吧。有些童鞋不理解什么默认路径方式中就有表?那是因为我们在它默认给我们创建数据库的时候我们有创建表的操作,就是MySQLiteOpenHelper类中的onCreate()方法里的操作!所以我们如果要在进行删除数据、添加数据等操作的之前还要创建一个表,创建表的方法都是一样的。总结:不管哪种方式我们都要-创建数据库-创建表-然后进行操作!备注4:在Android中查询数据是通过Cursor类来实现的,当我们使用()方法时,会得到一个Cursor对象,Cursor指向的就是每一条数据。它提供了很多有关查询的方法,具体方法如下:以下是方法和说明:movefalse以当前的位置为参考,将Cursor移动到指定的位置,成功返回true,失败返回moveToPosition将Cursor移动到指定的位置,成功返回true,失败返回falsemoveToNextmoveToLast将Cursor向前移动一个位置,成功返回true,失败返回false将Cursor向后移动一个位置,成功返回true,失败返回false。movetoFirst将Cursor移动到第一行,成功返回true,失败返回falseisBeforeFirst返回Cursor是否指向第一项数据之前isAfterLastisClosedisFirstisLastisNull返回Cursor是否指向最后一项数据之后返回Cursor是否关闭返回Cursor是否指向第一项数据返回Cursor是否指向最后一项数据返回指定位置的值是否为nullgetCount返回总的数据项数getInt返回当前行中指定的索引数据对于SQLite的很多童鞋有接触过,但是就不知道怎么存储在SD中,所以我也研究了下,这篇也写了把sd卡中的方式也提供给大家。OK这元旦放假几天就光给大家写这个了,呵呵~凌晨2点了,咳咳~该睡觉了。(我一般凌成3点睡觉,早8点起来上班呵呵~习惯了~)(推荐大家订阅本博客,因为咱的更新速度可是很快的~娃哈哈)
发布者:admin,转转请注明出处:http://www.yc00.com/web/1689429267a246773.html
评论列表(0条)