Android提供了5种方式存储数据_第1页
Android提供了5种方式存储数据_第2页
Android提供了5种方式存储数据_第3页
Android提供了5种方式存储数据_第4页
Android提供了5种方式存储数据_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、Android提供了5种方式存储数据-使用SharedPreferences存储数据;-文件存储数据;-SQLite数据库存储数据;-使用ContentProvider存储数据;-网络存储数据一:使用SharedPreferences存储数据首先说明SharedPreferences存储方式,它是Android提供的用来存储一些简单配置信息的一种机制,例如:登录用户的用户名与密码。其采用了Map数据结构来存储数据,以键值的方式存储,可以简单的读取与写入,具体实例如下:void ReadSharedPreferences()String strName,strPassword;SharedPre

2、ferences user = getSharedPreferences(“user_info”,0); strName = user.getString(“NAME”,”); strPassword = user getString(“PASSWORD”,”);void WriteSharedPreferences(String strName,String strPassword)SharedPreferences user = getSharedPreferences(“user_info”,0);uer.edit();user.putString(“NAME”, strName);us

3、er.putString(“PASSWORD” ,strPassword);mit();数据读取与写入的方法都非常简单,只是在写入的时候有些区别:先调用edit()使其处于编辑状态,然后才能修改数据,最后使用commit()提交修改的数据。实际上SharedPreferences是采用了XML格式将数据存储到设备中,在DDMS中的File Explorer中的/data/data/shares_prefs下。以上面的数据存储结果为例,打开后可以看到一个user_info.xml的文件,打开后可以看到:moandroidSharedPreferences使用SharedPreferences是有

4、些限制的:只能在同一个包内使用,不能在不同的包之间使用。使用步骤:存数据:使用SharedPreferences保存数据要经过4个步骤:获取对象、创建编辑器、修改内容、提交修改。接下来就仔细查看这四个步骤究竟是怎样的一个过程:1.获取对象通过getSharedPreferences()方法获取一个SharedPreferences对象,以方便对其进行相关操作,方法如下:getSharedPreferences(Content, Context.MODE_PRIVATE); 2.创建一个Editor编辑器在SharedPreferences中要编辑信息,必须取得一个编辑器,也就是Editor。E

5、ditor对象的作用是提供一些方法以便使用者修改XML文件中的内容,如添加字符串或整数等。方法如下:SharedPreferences.edit();3.使用Editor修改内容SharedPreferences根据方法名创建一个节点,根据这个方法的参数向节点中添加内容。方法如下:putString(String, data);4.提交内容将数据修改好之后,也就是putString()或其他put()方法执行完后,要将这个修改提交给SharedPreferences,以通知其将内容写入到XML文件中。使用的方法如下:mit();读数据:只要两个步骤就可以顺利取出保存的数据并使用:1.获得Sha

6、redPreferences对象获得的方法如下:getSharedPreferences(Content, Context.MODE_PRIVATE); 2.取出Key对应的Value即内容我们只要使用getString()等方法就可以了:SharedPreferences.getString()SharedPreferences.getBoolean()SharedPreferences.getFloat()SharedPreferences.getInt()SharedPreferences.getLong()二:文件存储数据文件存储方式是一种较常用的方法,在Android中读取/写入文件

7、的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。FilterInputStream, FilterOutputStream等可以到Java io package说明中去详细学习,不再此详细说明,具体实例如下:String fn = “moandroid.log”;FileInputStream fis = openFileInput(fn);FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);除此之外,Android还提供了其

8、他函数来操作文件,详细说明请阅读android sdk。1.文件保存在哪里事实上,文件保存的路径与SharedPreferences的保存路径差不多,位于/data/data/files下。2.文件操作的一些方法知道文件保存的位置和形式后,接下来需要知道操作文件的一些重要的方法,如表所示:操作文件的重要方法含义openFileInput()打开应用程序文件以便读取openFileOutput()创建应用程序文件以便写入deleteFile()通过名称删除文件fileList()获得所有位于/data/data/files下的文件列表getFileDir()获得/data/data/files子

9、目录对象getCacheDir()获得/data/data/cache子目录对象getDir()根据名称创建或获取一个子目录在程序默认位置创建和写入文件我们知道在Java中通过使用流来读写文件,要创建一个文件首先要建立一个输出流。在Android中同样如此,我们依靠openFileOutput()来获得一个输出流。它将在上一节中展示的位置创建一个文件,使用一个流要3个步骤:1.获得一个输出流对象获得一个输出流对象以进行文件操作,使用openFileOutput()方法可以很方便的获得,如下所示:openFileOutput(“myFile.txt”,Context.MODE_PRIVATE);

10、2.向流中写入数据获得了输出流之后我们需要向流中添加我们需要添加的信息了,同样非常方便,使用write()方法就可以了:write(data.getBytes();3.关闭流当数据写入完毕后,使用close()方法可以关闭输出流,方法如下所示:fos.close();在默认位置读取文件与上面类似,Android提供了读取文件的简便方法,同样需要3个步骤:1. 创建输入流首先,得到了一个输入字节流,参数是文件名。fis = openFileInput(“myFile”);接着,将其转换为字符流,这样可以一个字符一个字符地读取以便显示中文。isr = new InputStreamReader(f

11、is);br = new BufferedReader(isr);最后,我们又将其包装为缓冲流,这样可以一段一段地读取,减少读写的次数,保护硬盘。2. 读取数据从流中获得数据同样非常方便,这里没有使用read()方法而使用了readLine()方法,原因下文也会给出,代码如下:String s = null;S = (br.readLine();3. 关闭输入流这里记得每个流都要关闭哦:fis.close();isr.close();br.close();三SQLite数据库本节将讲解使用Android自带的关系型数据库SQLite。它是一个基于文件的轻量级数据库,为嵌入式设备量身打造而成。每

12、个应用程序创建的数据库都是私有的,但是ContentProvider可以把数据共享给其他的应用程序。本节中读者将学习到创建和删除数据库,创建和删除表,以及插入记录、更新记录、删除记录和查询记录等操作。1.怎样创建数据库创建数据库有多种方法,最简单的无疑是使用Context的openOrCreateDatabase()方法了。当然还有更加强大的方法,比如通过SQLiteOpenHelper类更有效地管理它。使用openOrCreateDatabase()方法创建数据库语法格式如下:ContextWrapper.openOrCreateDatabase(String name, int mode,

13、 CursorFactory factory)2.数据库文件被保存在哪里事实上,与SharedPreferences类似,数据库文件被保存在如下的目录下:/data/data/package name/databases3. 设置数据库创建完数据库后,为了更安全而有效地使用它,我们还需要对它进行一定的配置,主要的方法有3个,分别是:(1)设置本地化:db.setLocale(Locale.getDefault();(2)设置线程安全锁:db.setLockingEnabled(true);(3)设置版本:db.setVersion(1);4.关闭数据库当我们不再需要使用数据库时可以考虑将其关闭

14、,关闭的方法非常简单,只需要调用方法:db.close();5.删除数据库有些时候基于某种需求我们需要将数据库彻底删除,方法同样非常简单:Context.deleteDatabase();创建和删除表1. 创建表创建了数据库之后,我们接下来的工作就是在数据库中创建表了,只有拥有了表,数据库才有意义。创建表的方法是执行相应的SQL语句。例如,要创建一个名为userInfo_brief的表,需要的SQL语句为:CREATE TABLE userInfo_brief (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,password TEXT);创建pe

15、rson表db.execSQL(CREATE TABLE person (_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age SMALLINT);2. 删除表相应的,如果要删除表userInfo_brief ,其SQL语句为:DROP TABLE userInfo_brief;与其对应的Java代码为:Sring sql = “DROP TABLE ”+ TABLENAME_1 + “;”;db.execSQL(sql)操作记录操作记录大致为插入操作、更新操作以及删除操作。SQLiteDatabase类提供了3个简单的方法来完成对应

16、的操作,它们分别是:SQLiteDatabase.insert() SQLiteDatabase.update()SQLiteDatabase.delete()1. 插入记录插入记录时,我们需要使用方法:SQLiteDatabase.insert(String table, String nullColumnHack, ContentValues values)/ContentValues以键值对的形式存放数据ContentValues cv = new ContentValues();cv.put(name, );cv.put(age, person.age);/插入C

17、ontentValues中的数据db.insert(person, null, cv);2. 更新记录更新记录时,我们需要使用方法:SQLiteDatabase.update(String table, ContentValues values, String whereClause, String whereArgs)3. 删除记录删除记录时,我们需要使用方法:SQLiteDatabase.delete(String table, String whereClause, String whereArgs)1. 使用query()查询方法查询数据:Cursor c = db.rawQuery(

18、SELECT * FROM person WHERE age = ?, new String33);while (c.moveToNext() int _id = c.getInt(c.getColumnIndex(_id);String name = c.getString(c.getColumnIndex(name);int age = c.getInt(c.getColumnIndex(age);c.close();/删除数据db.delete(person, age ?, new String35);/关闭当前数据库db.close();/删除test.db数据库/deleteData

19、base(test.db);SQLite数据库提供了一些方法可以使我们很方便的执行查询,而避免了写一些繁琐的SELECT查询语句,当然,你也不必担心,因为它提供的方法其实与SELECT语句一脉相承。其语法格式如下:SQLiteDatabase.query(String table, String columns, String selection, String selectionArgs, String groupBy, String having, String orderBy)2. 使用Cursor对象保存查询结果Cursor对象只能暂时地保存数据,如果只需要完成一些简单的操作可以快速地

20、执行,执行完后关闭它。接下来学习一些经常使用的Cursor对象的方法;(1)Cursor.getCount()获得Cursor对象中记录条数,可以理解为有几行。(2)Cursor.getColumnCount(),获得Cursor对象中记录的属性个数,可以理解为有几列。(3)Cursor.moveToFirst(),将Cursor对象的指针指向第一条记录。(4)Cursor.moveToNext(),将Cursor对象的指针指向吓一跳。(5)Cursor.isAfterLast(),判断Cursor对象的指针是否指向最后一条记录。(6)Cursor.close(),关闭Cursor对象。(7)

21、Cursor.deactivate(),取消激活状态。(8)Cursor.requery(),重新查询刷新数据。3. 执行查询操作4. 使用SQLiteQueryBuilder如果我们需要执行多表查询就要使用SQLiteQueryBuilder,接下来我们需要执行多表查询:SELECT user_,User_brief.password,User_detail.age,User_detail.sexFROMuser_brief, user_detailWHERE user_ = user_ AND user_ =

22、 “wes”ORDERBY age ASC为了能更好地管理数据库,Android SDK为我们提供了数据库的一个帮助类SQLiteOpenHelper。要使用SQLiteOpenHelper类需要如下步骤:1.继承SQLiteOpenHelper类2. 得到帮助类的对象通过帮助类的构造方法可以顺利地得到帮助类的对象:DatabaseHelper helper = new DatabaseHelper(Context context, String name, CursorFactory factory, int version)3. 获得数据库顺利地获得数据库帮助类的对象后,无论在什么时候,我

23、们都可以很方便地得到一个可读或者可写数据库,得到可写数据库的具体语法格式如下:SQLiteOpenHelper.getWritableDatabase()或者可以通过以下方法得到可读数据库:SQLiteOpenHelper.getReadableDatabase()事务的操作public void add(List persons) db.beginTransaction();/开始事务 try for (Person person : persons) db.execSQL(INSERT INTO person VALUES(null, ?, ?, ?), new Objectperson.

24、name, person.age, ); db.setTransactionSuccessful();/设置事务成功完成 finally db.endTransaction();/结束事务 四:ContentProvider1、ContentProvider简介当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpr

25、eferences API读写数据。而使用ContentProvider共享数据的好处是统一了数据访问方式。2、Uri类简介Uri代表了要操作的数据,Uri主要包含了两部分信息:1.需要操作的ContentProvider ,2.对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:1.scheme:ContentProvider(内容提供者)的scheme已经由Android所规定为:content:/。2.主机名(或Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。3.路径(path):可以用来表示我们要操

26、作的数据,路径的构建应根据业务而定,如下:要操作contact表中id为10的记录,可以构建这样的路径:/contact/10要操作contact表中id为10的记录的name字段, contact/10/name要操作contact表中的所有记录,可以构建这样的路径:/contact?要操作的数据不一定来自数据库,也可以是文件等其他存储方式,如下:要操作xml文件中contact节点下的name节点,可以构建这样的路径:/contact/name如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:Uri uri = Uri.parse(content:/com.ch

27、vider.contactprovider/contact)3、UriMatcher、ContentUrist和ContentResolver简介因为Uri代表了要操作的数据,所以我们很经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。UriMatcher:用于匹配Uri,它的用法如下:1.首先把你需要匹配Uri路径全部给注册上,如下:/常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。UriMatcher

28、 uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);/如果match()方法匹配content:/vider.contactprovider/contact路径,返回匹配码为1uriMatcher.addURI(“vider.contactprovider”, “contact”, 1);/添加需要匹配uri,如果匹配就会返回匹配码/如果match()方法匹配 content:/vider.cont

29、actprovider/contact/230路径,返回匹配码为2uriMatcher.addURI(“vider.contactprovider”, “contact/#”, 2);/#号为通配符2.注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content:/vider.contactprovider/contact路径,返回的匹配码为1。Conten

30、tUris:用于获取Uri路径后面的ID部分,它有两个比较实用的方法:withAppendedId(uri, id)用于为路径加上ID部分parseId(uri)方法用于从路径中获取ID部分ContentResolver:当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,来操作数据。1.什么是Co

31、ntentProviderContentProvider机制可以帮助开发者在多个应用中操作数据,包括存储、修改和删除等。这也是在应用间共享数据的唯一方式。一个ContentProvider类实现了一组标准的接口,它们是:(1)ContentProvider.insert(Uri arg0, ContentValues arg1)(2)ContentProvider.query(Uri arg0, String arg1, String arg2, String arg3, String arg4)(3)ContentProvider.update(Uri arg0, ContentValues

32、 arg1, String arg2, String arg3)(4)ContentProvider.delete(Uri arg0, String arg1, String arg2)(5)ContentProvider.getType(Uri arg0)2. 什么是URIURI是Universal Resource Identifier的缩写,也就是通用资源标志符的意思。它的作用就是告诉使用者,数据的具体位置,所以在URI中一定包含有数据的路径。事实上,在Android的Uri中主要包括3个部分:(1)“content:/”,Android命名机制规定所有的内容提供者Uri必须以“cont

33、ent:/”开头。(2)数据路径,正如前文所说,通过该路径其他的应用程序可以顺利地找到具体数据。(3)ID,这个是可选的,如果不填表示取得所有的数据。3. ContentResolverAndroid的数据共享机制中,ContentProvider作为提供者出现,而ContentResolver则作为消费者出现。通过getContentResolver()可以得到当前应用的ContentResolver对象。要实现一个ContentResolver同样需要实现5个接口,与ContentProvider一一对应:(1)ContentResolver. delete(Uri url,String

34、where,String selectionArgs)(2)ContentResolver .update(Uri uri,ContentValuesvalues,Stringwhere,StringselectionArgs)(3)ContentResolver.query(Uriuri,Stringprojection,Stringselection,StringselectionArgs,String sortOrder)(4)ContentResolver. insert(Uri url,ContentValues values) (5)ContentResolver. getType

35、(Uri url)获得手机中联系人的实例:(1)查询联系人列表获得Cursor对象,方法为:managedQuery(Uri uri, String projection, String selection, String selectionArgs, String sortOrder) (2)新建Adapter: ListAdapter adapter = new SimpleCursorAdapter(Context context, int layout, Cursor c, String from, int to)(3)设置Adapter setListAdapter(adapter)

36、;private StringBuilder getContacts() StringBuilder sbLog = new StringBuilder(); / 得到ContentResolver对象 ContentResolver cr =this.getContentResolver(); / 取得电话本中开始一项的光标,主要就是查询contacts表 Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if(!cursor.moveToFirst() sbLog

37、.append(获取内容为空!); return sbLog; if(cursor.moveToFirst() / 取得联系人名字(显示出来的名字),实际内容在ContactsContract.Contacts中int nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); String name = cursor.getString(nameIndex); sbLog.append(name= + name + ;); / 取得联系人IDString contactId = cursor.getSt

38、ring(cursor.getColumnIndex(ContactsContract.Contacts._ID); / 根据联系人ID查询对应的电话号码 Cursor phoneNumbers = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + = + contactId, null, null); / 取得电话号码(可能存在多个号码) while (phoneNumbers.moveToNext() S

39、tring strPhoneNumber = phoneNumbers.getString(phoneNumbers.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); sbLog.append(Phone= + strPhoneNumber + ;); phoneNumbers.close(); / 根据联系人ID查询对应的email Cursor emails = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + = + contactId, null, null); / 取得email(可能存在多个email) while (emails.moveToNext() String strEmail = emails.getString(emails.getColumnIndex(ContactsContract.

温馨提示

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

最新文档

评论

0/150

提交评论