在我们的android实际开发过程,必不可少的一种行为操作对象就是数据。有些数据,对于用户而言是一次性的,这就要求我们每次进到App的时候,都需要去刷新数据。有些数据,对于用户而言又是具有一定时效性的,比如用户账号数据。这种情况下,就要求我们采用一定的数据保存措施,在这篇博客里面,我将为大家分享一些android里面常用的数据保存方法。

首先在android里面我们用的比较多的小数量存储方式可能就是SharedPreferences,那么什么是SharedPreferences呢?为了保存软件的设置参数,Android 平台为我们提供了一个SharedPreferences 类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。使用SharedPreferences 保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs 目录下。说白了,它实际上也是一种文件存储方式。下面让我们来看看它的具体用法:

public static void openSharep(Context context,String name){SharedPreferences sharedPreferences=context.getSharedPreferences(name,Context.MODE_PRIVATE);SharedPreferences.Editor editor=sharedPreferences.edit();editor.putString("name","hello");editor.commit();}

上面是将一个字符串,通过键值对的方式存储到xml文件里面。这个时候,你也许会问:在什么情况下,会将SharedPreferences里面的数据删掉呢?当我们卸载app的时候,SharePreferences是否还在呢?当我的应用程序更新的时候,SharePreferences文件是否还在呢?我想这有可能跟你当前所使用android系统版本有关系,本人也没有细查这个问题,如有不对还请留言讨论。通过上面的代码你可能就能够发现,SharePreferences里面保存的数据还是相当有限的,主要是一些标识类的数据。

那么如果你需要在项目里面保存大量的数据,你会怎么办呢?其实常用的有两种方式:一种是文件存储;另外一种就是sqlite数据库;文件储存的方式,我们就不做过多的解释了,直接上代码,大家肯定就能够明白了。

String fileName = etFileName.getText().toString();String fileContent = etFileContent.getText().toString();FileOutputStream out = null;try {out = context.openFileOutput(fileName, Context.MODE_PRIVATE);out.write(fileContent.getBytes("UTF-8"));Toast.makeText(this,"保存成功",Toast.LENGTH_SHORT).show();} catch (Exception e) {e.printStackTrace();}finally {try{out.close();}catch (Exception e){e.printStackTrace();}}

上面的代码我们直接定义一个输出流就可以将我们希望保存的信息写入文件系统里面了。然后我们再来看看读取流的代码:

String fileName=etFileName.getText().toString();FileInputStream in=null;ByteArrayOutputStream bout=null;byte[] buf=new byte[1024];bout=new ByteArrayOutputStream();int length=0;try{in=context.openFileInput(fileName);while((length=in.read(buf))!=-1){bout.write(buf,0,length);}byte[] content = bout.toByteArray();tvInfo.setText(new String(content,"UTF-8")); //设置文本框为读取的内容}catch (Exception e){e.printStackTrace();}tvInfo.invalidate();   //刷新屏幕try{in.close();bout.close();}catch(Exception e){}

通过上面的文件操作代码,我们可以很直观的发现文件系统无非就是一些中规中矩的文件读写操作了。接下来,我们将重点看看数据保存的最重要角色sqlite数据库。通过数据库保存下来的文件,我们都知道相对于普通的文件系统具有更好的结构性。就是说我们在操作数据的时候,可以更加有条理性的进行。

首先让我们来看看android里面应该怎样定义一个数据库操作对象呢?其实很简单,我们只需要定义一个类,然后让它继承SQLiteOpenHelper就可以了。请看测试类定义:

public class SqliteTest extends SQLiteOpenHelper {public SqliteTest(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);}@Overridepublic void onCreate(SQLiteDatabase db) {}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}

通过上面的类定义我们可以看到,当我们实现一个构造方法、onCreate、onUpgrade方法之后,我们具有一个数据库操作的对象了。接下来让我们首先来完善一下上面SqliteTest类,提供完整的代码实现:

public class SqliteTest extends SQLiteOpenHelper {private static final int VERSION = 1;private static final String DB_NAME = "test.db";public SqliteTest(Context context) {super(context, DB_NAME, null, VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE IF NOT EXISTS person" +"(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER, info TEXT)");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("ALTER TABLE person ADD COLUMN other STRING");}
}

然后当我们拿到这个数据库操作的对象之后,就应该考虑怎样使用这个对象了?比如我现在想要往这个数据库里面插入一些数据,请看下面的测试代码:

private SQLiteDatabase db;
private SqliteTest helper;private void getSqliteDb(){db=helper.getWritableDatabase();}private void addData(List<Person> persons){db.beginTransaction();  //开始事务try {for (Person person : persons) {db.execSQL("INSERT INTO person VALUES(null, ?, ?, ?)", new Object[]{person.name, person.age, person.info});}db.setTransactionSuccessful();  //设置事务成功完成} finally {db.endTransaction();    //结束事务}}

通过上面的代码我就可以实现数据的插入操作了。

在这篇博客的最后,让我们来看看SQLiteOpenHelper类的源码,探索一下为什么实现该类之后就能够进行数据库操作了呢?我们可以先来看看如下方法:

public SQLiteDatabase getWritableDatabase() {synchronized (this) {return getDatabaseLocked(true);}}

当我们调用getWriteableDatabase方法之后,程序会同步的调用getDatabaseLocked方法:

private SQLiteDatabase getDatabaseLocked(boolean writable) {if (mDatabase != null) {if (!mDatabase.isOpen()) {// Darn!  The user closed the database by calling mDatabase.close().mDatabase = null;} else if (!writable || !mDatabase.isReadOnly()) {// The database is already open for business.return mDatabase;}}if (mIsInitializing) {throw new IllegalStateException("getDatabase called recursively");}SQLiteDatabase db = mDatabase;try {mIsInitializing = true;if (db != null) {if (writable && db.isReadOnly()) {db.reopenReadWrite();}} else if (mName == null) {db = SQLiteDatabase.create(null);} else {try {if (DEBUG_STRICT_READONLY && !writable) {final String path = mContext.getDatabasePath(mName).getPath();db = SQLiteDatabase.openDatabase(path, mFactory,SQLiteDatabase.OPEN_READONLY, mErrorHandler);} else {db = mContext.openOrCreateDatabase(mName, mEnableWriteAheadLogging ?Context.MODE_ENABLE_WRITE_AHEAD_LOGGING : 0,mFactory, mErrorHandler);}} catch (SQLiteException ex) {if (writable) {throw ex;}Log.e(TAG, "Couldn't open " + mName+ " for writing (will try read-only):", ex);final String path = mContext.getDatabasePath(mName).getPath();db = SQLiteDatabase.openDatabase(path, mFactory,SQLiteDatabase.OPEN_READONLY, mErrorHandler);}}onConfigure(db);final int version = db.getVersion();if (version != mNewVersion) {if (db.isReadOnly()) {throw new SQLiteException("Can't upgrade read-only database from version " +db.getVersion() + " to " + mNewVersion + ": " + mName);}db.beginTransaction();try {if (version == 0) {onCreate(db);} else {if (version > mNewVersion) {onDowngrade(db, version, mNewVersion);} else {onUpgrade(db, version, mNewVersion);}}db.setVersion(mNewVersion);db.setTransactionSuccessful();} finally {db.endTransaction();}}onOpen(db);if (db.isReadOnly()) {Log.w(TAG, "Opened " + mName + " in read-only mode");}mDatabase = db;return db;} finally {mIsInitializing = false;if (db != null && db != mDatabase) {db.close();}}}

调用这个方法之后系统就能够给我们提供一个SQLiteDatabase对象,然后我们就可以利用SQLiteDatabase利用的方法进行数据库操作了。

至于SQLiteDatabase层的源码,我自己还没有怎么研究过,如有什么不对的地方,欢迎拍砖!

转载于:https://www.cnblogs.com/xiaocai20091687/p/android_xiaocai_sqlite.html

android开发系列之数据存储相关推荐

  1. android中资源文件的两种访问方式,在android开发中进行数据存储与访问的多种方式介绍...

    在android开发中进行数据存储与访问的多种方式介绍 更新时间:2013年06月07日 16:24:23   作者: 很多时候我们的软件需要对处理后的数据进行存储或再次访问,Android为数据存储 ...

  2. android app数据存储,基于Android开发的APP数据存储研究

    谢原武+龙文 摘要: 作为一个完整的应用程序,数据存储操作是必不可少的.Android系统一共提供了四种数据存储方式分别为File文件存储.Shared Preferences存储.ContentPr ...

  3. Android开发--SQLit嵌入式数据存储

    一.SQLite简介 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对 ...

  4. android界面数据存储,Android应用开发基础之数据存储和界面展现(二)

    Android应用开发基础之数据存储和界面展现(二) 常见布局 相对布局 RelativeLayout 组件默认左对齐.顶部对齐 设置组件在指定组件的右边 android:layout_toRight ...

  5. Android App开发基础篇—数据存储(SQLite数据库)

    Android App开发基础篇-数据存储(SQLite数据库) 前言:Android中提供了对SQLite数据库的支持.开发人员可以在应用中创建和操作自己的数据库来存储数据,并对数据进行操作. 一. ...

  6. Android开发系列7——icon图标和开机启动页

    前言   Android开发App过程中,需要一个独特吸引眼球的应用icon,以及标新的Launch页面用于简明的介绍.为了适配各种 手机的尺寸和手机屏幕分辩率,需要同一张图片制作多种尺寸用于兼容各种 ...

  7. Android开发中保存数据的四种方法方法

    本文来自:安卓航班网 在Android开发中我们会接触到四种数据存储方式,每种存储方式都各有不同:以下安卓航班分别列举了Android开发中的不同存储方式的特点. 一,Preferences Pref ...

  8. Android的5种数据存储方式概述

    Android有5种数据存储方式,具体分类如下: 1.应用内数据存储方式,程序外不可访问:SharedPreferences存储 应用场景:存储应用配置信息和常用信息. 获取SharedPrefere ...

  9. android 获取加速度传感器值,Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】...

    本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; im ...

最新文章

  1. 软件定义的数据中心-【软件和信息服务】2012.11
  2. libtorchWindows中的使用
  3. html显示elasticsearch,ElasticSearch查询:高亮显示(10)
  4. 互联神州CCNA、CCNP、CCSP、CCIE----寒假特惠
  5. 【职场经验】算法同学从学校到实习,需要改变什么
  6. SpringSecurityOAuth使用JWT Token实现SSO单点登录
  7. java操作poi如何更改excel中的数据
  8. Tomcat源码解析三:tomcat的启动过程
  9. .NET Framework 4.5 五个很棒的特性
  10. Linux:进程实例信息(/proc)
  11. Mac 环境变量配置
  12. linux-shell-命令总结
  13. Intent.ACTION_PICK
  14. 【Vue2.0】—github小案例(二十三)
  15. 分析“HTTP500内部服务器错误”解决方法
  16. mysql 修改密码
  17. excel两个表格数据对比_两个excel表格核对的多种方法
  18. java多个文件压缩打包成zip下载
  19. Vue设置浏览器小图标(ICON)
  20. 快速矩阵乘法的研究——下

热门文章

  1. python对财务人员的帮助-还不熟练VBA的财务人,让Python带你弯道超车!
  2. python处理数据的优势-【Python数据分析基础】: 数据缺失值处理
  3. python怎么用拼音-又一个奇葩要求,Python是如何将“中文”转“拼音”的?
  4. python turtle循环图案-Python绘图Turtle库详解
  5. python批量下载文件-python使用selenium实现批量文件下载
  6. python小项目实例流程-《Python编程:从入门到实践》DEMO实例代码
  7. 为什么叫python编程-运维为什么要学编程?编程为什么是Python?
  8. 有必要学python吗-学习Python有必要去培训机构吗?
  9. 怎样看python源代码-如何直接从IDE读取Python源代码
  10. python编码规范手册-python编码规范