Android基础程序设计第六章-数据存储_第1页
Android基础程序设计第六章-数据存储_第2页
Android基础程序设计第六章-数据存储_第3页
Android基础程序设计第六章-数据存储_第4页
Android基础程序设计第六章-数据存储_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、第六章 数据存储6.1 数据存储方式6.5实战演练手机通讯录6.3 SharedPreferences存储6.6 小结6.2 文件存储6.4 SQLite数据库存储6.1 数据存储方式 Android平台提供3种数据存储方式文件存储:是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O程序是完全一样的,提供openFileInput()和openFileoutput()方法来读取设备上的文件。可以用来存储大数据,如文本、图片、音频和视频等。SharedPreferences:是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备

2、中。一般用来存储应用程序的各种配置信息,例如用户名、密码、网络配置信息等。SQLite数据库:SQLite是Android自带的一个轻量级数据库,支持SQL标准语法,利用很少的内存就有很好的性能,一般使用它作为复杂数据的存储引擎,可以存储用户信息等。6.2 文件存储6.2.1 文件存储简介文件存储是Android种最基本的一种数据存储方式,与Java中的文件存储存储类似,都是通过I/O流的形式把数据直接存储到文档中。不同的是,Android中的文件存储分为内部存储和外部存储6.2 文件存储6.2.2 文件存储在内部内部存储是指将应用程序中的数据以文件方式存储到设备内部(默认存储到/data/d

3、ata/files/目录下)内部存储方式存储的文件被其所创建的应用程序私有,如果其他应用程序要操作本程序中的文件,需要设置权限。当创建的应用程序被卸载时,其内部存储文件也随之被删除。6.2 文件存储内部存储使用的是Context类中提供的openFileOutput()方法和openFileInput()两个方法,通过这两个方法可以分别获取FileOutputStream对象和FileInputStream对象,然后进行读写操作:openFileOutput()用于打开应用程序中对应的输出流,将数据存储到指定的文件中;openFileInput()用于打开应用程序对应的输入流,读取指定文件中的

4、数据;其中参数“name”表示文件名,“mode”表示文件操作模式:MODE_PRIVATE是默认的操作模式MODE_APPEND则表示如果该文件已存在,就往文件里面追加内容FileOutputStream fos = openFileOutput(String name,int mode);FileInputStream fin = openFileInput(String name);6.2 文件存储/创建输出流 FileOutputStream fos; /通过输出流将数据保存 try/使用OpenFileOutput方法获取文件对象 fos = openFileOutput(data.

5、txt,MODE_APPEND); fos.write(saveInfo.getBytes(); fos.close(); catch(Exception e) e.printStackTrace(); 写入过程:读取过程: /读取过程 try /通过输入流将文件都取进来FileInputStream fin = openFileInput(data.txt);byte buffer = new bytefin.available(); fin.read(buffer); content = new String(buffer); fin.close(); catch(Exception e)

6、 e.printStackTrace(); 6.2 文件存储6.2.3 文件存储在外部内部存储是指将应用程序中的数据以文件方式存储到设备内部(默认存储到/data/data/files/目录下)内部存储方式存储的文件被其所创建的应用程序私有,如果其他应用程序要操作本程序中的文件,需要设置权限。当创建的应用程序被卸载时,其内部存储文件也随之被删除。6.2 文件存储由于外部存储设备可能被移除、丢失或处于其他状态,因此在使用外部设备之前必须使用Environment的getExternalStorageState()方法来确认外部设备是否可用Android 6.0之后系统为了更好的保护用户个人隐私,

7、添加了运行时权限:分为两类,一类是Normal Permissions,这类权限不涉及个人隐私,不需要用户进行授权,比如手机震动,访问网络;一类是Dangerous Permissions,这类权限涉及个人隐私,需要用户进行授权,比如读取SD卡,访问通讯录等。Android系统为了保证应用程序的安全做了相应规定,如果程序需要访问系统的一些关键信息,必须要在清单文件中声明权限才可以,否则程序运行时会直接崩溃6.2 文件存储首先在活动中调用onCreate()方法前声明运行时权限组:在onCreate()方法调用时,进行build版本比对并授予运行时权限:private static String

8、 PERMISSION_STORAGE = Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE ; /请求状态码 private static int REQUEST_PERMISSION_CODE = 2;if(Build.VERSION.SDK_INTBuild.VERSION_CODES.LOLLIPOP) if(ActivityCompat.checkSelfPermission(MainActivity.this,Manifest.permission.WRITE_

9、EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED)ActivityCompat.requestPermissions(MainActivity.this,PERMISSION_STORAGE,REQUEST_PERMISSION_CODE); 6.2 文件存储最后在清单文件中添加权限:6.3 SharedPreferences存储SharedPreferences是Android平台上一个轻量级存储类,也是最容易理解和使用的存储技术。主要用来存储程序的配置参数,例如用户名、密码、自定义参数的设置。区别于文件的存储方式,SharedPref

10、erences是使用键值对的方式将数据存储到XML文件中来保存数据的。该文件位于data/data/shared_prefs文件夹中。SharedPreferences支持多种不同数据类型存储,包括Float、Int、Long、Boolean、String、StringSet类型。6.3 SharedPreferences存储6.3.1 将数据存储到SharedPreferences中Android中提供了3种方法用于得到SharedPreferences对象:Context类中的getSharedPreferences()方法Activity类中的getPreferences()方法Pref

11、erenceManager类中的getDefaultSharedPreferences()方法将数据存储到SharedPreferences文件中:SharedPreferences.Editor editor = getSharedPreferences(data,MODE_PRIVATE).edit(); editor.putString(name,Tom); editor.putInt(age,28); editor.putBoolean(married,false); editor.apply();6.3 SharedPreferences存储6.3.2从SharedPreferenc

12、es中读取数据SharedPreferences对象中提供了一系列的get方法,用于读取数据;每种get方法都对应了SharedPreferences.Editor中的一种put方法;get方法都要接收两个参数,第一个参数是键,即存储对应数据时使用的键值;第二个参数是默认值,表示当传入的键值找不到对应值时会以什么样的默认值返回。 SharedPreferences pref = getSharedPreferences(data,MODE_PRIVATE); String name = pref.getString(name,); int age = pref.getInt(age,0); b

13、oolean married = pref.getBoolean(married,false); String info = name is : +name+n+age is :+age+ n +married is :+married;6.3 SharedPreferences存储6.3.3 实战演练23功能描述:技术要点:编辑布局编辑逻辑代码,用来记住配置文件使用SharedPreferences技术实现了记住密码功能案例代码(详见教材P132P135)实现步骤: 实现记住密码功能使用SharedPreferences存储配置信息,通过SharedPreferences读取存储的配置信息。

14、16.4 SQLite数据库存储Android系统提供了SQLite数据库,可以用来存储大量的数据并对数据进行管理和维护。SQLite是一款轻量级的关系型数据库,运算速度非常快,占用资源很少,通常只需要几百KB的内存就足够,因此适合在移动设备上使用。SQLite不仅支持标准的SQL语法,还遵循数据库的ACID事务,只要之前使用过其他关系型数据库,就可以很快上手SQLite,且SQLite比一般的数据库要简单的多,它不需要设置用户名和密码就可以使用。它还能够支持Windows/Linux/UNIX等主流操作系统,能够跟很多程序语言,例如Tcl、C#、PHP、Java等结合。6.4 SQLite数

15、据库存储SQLite没有服务器进程,通过文件保存数据,该文件是跨平台的,可以放在其他平台中使用。保存数据时,支持null(零)、integer(整数)、real(浮点数字)、text(字符串文本)和blob(二进制对象)5种数据类型,同时还接收varchar(n)、char(n)、decimal(p,s)等数据类型,但是在运算或保存的时候会转换成对应的5种数据类型。6.4 SQLite数据库存储6.4.1 创建数据库Android为了让我们能够更加方便的管理数据库,专门提供了一个SQLiteOpenHelper数据库帮助类,借助这个类可以简单对数据库进行创建和升级。 SQLiteOpenHel

16、per是一个抽象类,因此我们要使用的话需要创建自己的帮助类去继承它SQLiteOpenHelper中还有两个非常重要的实例方法:getReadableDatabase()和getWrit-ableDatabase()6.4 SQLite数据库存储在新建的项目中创建MyDatabaseHelper类继承自SQLiteOpenHelper类,重写抽象方法并在构造方法中创建数据表Studentpublic class MyDatabaseHelper extends SQLiteOpenHelper public static final String CREATE_STUDENT= create

17、table Student ( + id integer primary key autoincrement, /主键自增长 + stuName text, /学生姓名 文本类型 + stuNo text, /学号 文本类型 + stuAge integer, /年龄 + stuMajor text); /专业 private Context mContext; public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) super(contex

18、t, name, factory, version); mContext = context; Override public void onCreate(SQLiteDatabase db) db.execSQL(CREATE_STUDENT); Toast.makeText(mContext, 恭喜数据库创建成功!, Toast.LENGTH_SHORT).show(); Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 6.4 SQLite数据库存储6.4.2 升级数据库My

19、DatabaseHelper中还有一个方法onUpgrade(),这个方法主要完成数据库的升级操作例如现在如果我们需要添加一张表用于记录图书分类:首先确定创建表Category的SQL语句接下来,我们将上述语句添加到刚才创建的自定义帮助类MyDatabaseHelper中create table Category (id integer primary key autoincrement,category_name text,category_code integer)6.4 SQLite数据库存储public class MyDatabaseHelper extends SQLiteOpen

20、Helper Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) db.execSQL(drop table if exists Student); db.execSQL(drop table if exists Category); onCreate(db); onUpgrade()方法中执行了两条drop语句,表示如果数据库中存在Student表或Category表则将这两张表删除,然后调用onCreate()方法重新创建。6.4 SQLite数据库存储6.4.3 添加数据调用S

21、QLiteOpenHelper的getReadableDatabase()和getWritableDatabase()方法可以用于创建和升级数据库,同时,这两个方法还会返回一个SQLiteDatabase对象,借助这个对象,我们可以完成数据库的增、删、查操作。 public void onClick(View v) SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); / 开始组装第一条数据 values.put(stuName, Lucy Wang); v

22、alues.put(stuNo, 0201170101); values.put(stuAge, 18); values.put(stuMajor, Software Engineering); db.insert(Student, null, values); / 插入第一条数据 values.clear(); 6.4 SQLite数据库存储6.4.4 更新数据SQLiteDatabase数据库提供了一个好用的方法uodate(),用于对数据进行更新,这个方法接收4个参数,第一个参数和前面insert()方法一样,表示要更新哪张表中的数据。第二个参数是ContentValues对象,要把更新

23、数据组装进去。第三、第四个参数用于约束更新某一行或某几行的数据,不指定时指更新所有行。 Override public void onClick(View v) SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(stuMajor, Software Engineering); db.update(Student, values, stuName = ?, new String Jone Dou ); 6.4 SQLite数据库存储6

24、.4.5 删除数据接下来我们通过学习SQLiteDatabase的delete()方法学习如何从数据库中删除数据,这个方法很简单,在方法中只接受3个参数,第一个参数仍然是表名,第二、第三个参数用来指明删除某一行或某几行的数据,不指定默认情况下就是删除所有行。 Override public void onClick(View v) SQLiteDatabase db = dbHelper.getWritableDatabase(); db.delete(Student, stuAge ?, new String 18 ); 6.4 SQLite数据库存储6.4.6 查询数据数据库中SQL查询涉及的内容很多,SQLiteDatabase中提供了一个query()方法用于对数据进行查询,这个方法中最短的方法重载需要传入7个参数。Override public void onClick(View v) SQLiteDatabase db = dbHelper.getWritableDatabase(); / 查询Book表中所有的数据 Cursor cursor = db.query(Student, null, null

温馨提示

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

评论

0/150

提交评论