`
crazier9527
  • 浏览: 1010855 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

理解 Android 本地数据存储 AP(转)

阅读更多

样例应用程序

为了突出 Android 应用程序开发的本地存储方面,我这里介绍一个样例应用程序,它允许您测试各种类型 API 的执行。有 源代码 可供下载。该应用程序支持 图 1 中的操作。


图 1. 用例
 

图 1 列出了以下用例:

  • 管理和存储首选项
  • 从应用程序资产加载信息
  • 将信息导出到内部内存、外部内存和本地数据库
  • 从内部内存和本地数据库读取数据
  • 清除已存储的信息
  • 在屏幕上查看信息

通篇文章中,详细介绍了在应用程序中使用本地存储,如下:

  • 从用户捕获首选项,本地存储起来,并在整个应用程序中加以使用。
  • 从内部应用程序资产检索一个用户图片,存储在本地内部内存和外部内存中,并呈现在屏幕上。
  • 从应用程序的资产检索一个 JSON 格式的好友列表。解析并存储在本地内部内存、外部内存和关系数据库中,再呈现在屏幕上。

样例应用程序定义了 表 1 中的类。


表 1. 样例应用程序中的类

类 说明
MainActivity Main Activity;大多数样例代码都驻留在这里
Friend 描绘一个 Friend
AppPreferenceActivity Preferences Activity 和屏幕
DBHelper 一个用于 SQLite 数据库管理的帮助器类

示例应用程序使用了两种类型的数据。第一种是应用程序首选项,存储为名-值对。对于首选项,定义了以下信息:

  • 一个 filename,用于加载和存储好友姓名列表
  • 一个 filename,用于加载和存储用户的一幅图片
  • 一个 flag,如果设置了,那么表示在应用程序启动时自动删除所有已存储的数据

第二种类型的数据是好友列表。好友列表最初表示为 Facebook Graph API JSON 格式,包含一组姓名和好友对象(参见 清单 1)。


清单 1. 好友列表(Facebook Graph API JSON 格式)

    
{
   "data": [
      {
         "name": "Edmund Troche",
         "id": "500067699"
      }
   ]
}

上面的简单格式使得 Friend 对象和数据库模式也简单。清单 2 展示了 Friend 类。


清单 2. Friend 类

    
package com.cenriqueortiz.tutorials.datastore;

import android.graphics.Bitmap;

/**
 * Represents a Friend
 */
public class Friend {
    public String id;
    public String name;
    public byte[] picture;
    public Bitmap pictureBitmap;;
}

除了 ID 和姓名之外,样例应用程序也保留了对好友图片的引用。尽管样例应用程序没有使用这些引用,但是您很容易扩展样例应用程序,以从 Facebook 检索图片并显示在主屏幕中。

数据库模式包含单个表,用于存储 Friend 的信息。表有三列:

  • 惟一的 ID 或键
  • Facebook ID
  • Friend 的姓名

清单 3 展示了相应关系表声明的 SQL 语句。


清单 3. Friend 数据库表

    
db.execSQL("create table " + TABLE_NAME + " (_id integer primary key autoincrement, " 
+ " fid text not null, name text not null) ");

根据此信息,您可以在主屏幕上显示姓名;使用 ID,您可以检索所选用户的额外详细信息。在样例应用程序中,只显示了姓名。检索额外信息留给您去试验。注意,您很容易更改代码,以直接转向 Facebook。

存储应用程序首选项

本节介绍 Preferences API 和屏幕。Android API 提供很多方式处理首选项。其中一种方式是直接使用 SharedPreferences,并使用您自己的屏幕设计和首选项管理。第二种方法是使用 PreferenceActivityPreferenceActivity 自动负责首选项如何呈现在屏幕上(默认情况下,看起来跟系统首选项一样),并通过使用 SharedPreferences 在用户与每个首选项交互时自动存储或保存首选项。

为了简化样例应用程序,使用一个 PreferenceActivity 来管理首选项和首选项屏幕(参见 图 2)。首选项屏幕显示两个部分:Assets 和 Auto Settings。在 Assets 下,您可以为 Friends List 和 Picture 选项输入文件名。在 Auto Settings 下,您可以选中一个复选框,以便在启动时删除信息。


图 2. 实现的 Preferences 屏幕
实现的 Preferences 屏幕的屏幕截图 

在 图 2 中,布局是用 XML 以声明式方法定义的(不是以编程方式);声明式 XML 是首选方法,因为它保持了源代码的清晰可读。清单 4 展示了 Preferences UI 的 XML 声明。


清单 4. Preferences 屏幕的 XML 声明

    
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/prefs_screen"
        android:key="preferencescreen"
    >
    <PreferenceCategory android:title="Assets">
        <EditTextPreference 
            android:key="@string/prefs_assetname_friendslist_key"
            android:title="Friends List" 
            android:summary="Please enter filename"
            android:defaultValue="friends.txt"
        />
        <EditTextPreference 
            android:key="@string/prefs_assetname_picture_key"
            android:title="Picture" 
            android:summary="Please enter filename"
            android:defaultValue="pict2.jpg"
        />
    </PreferenceCategory>

    <PreferenceCategory android:title="Auto Settings">
        <CheckBoxPreference
            android:key="@string/prefs_autodelete_key"
            android:title="Delete at Startup" 
            android:summary="Check to clear at startup"
            android:defaultValue="false"
        />
    </PreferenceCategory>
</PreferenceScreen>

PreferenceScreen 包含 EditTextPreference 的两个实例、一个 CheckBoxPreference 和两个由 PreferenceCategory 定义的类别组(一个用于 Asset,另一个用于 Auto Settings)。

在样例应用程序中,设计要求 Preference 屏幕使用菜单项进行调用。为此,使用一条 Intent 消息来调用叫做 AppPreferenceActivity的 Preference Screen Activity(参见 清单 5)。注意,我没有详细介绍 Intent 如何工作。关于 Intent 的更多信息,请参见 参考资料


清单 5. AppPreferenceActivity

    
/*
 * AppPreferenceActivity is a basic PreferenceActivity
 * C. Enrique Ortiz | http://CEnriqueOrtiz.com
 */
package com.cenriqueortiz.tutorials.datastore;

import android.os.Bundle;
import android.preference.PreferenceActivity;

public class AppPreferenceActivity extends PreferenceActivity {

    /**
     * Default Constructor
     */
    public AppPreferenceActivity() {}

   /** 
    * Called when the activity is first created. 
    *   Inflate the Preferences Screen XML declaration.
    */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.prefs); // Inflate the XML declaration
    }   

}

在样例应用程序中,像 清单 6 中一样,从菜单项处理程序中调用 Intent。


清单 6. 使用 Intent 调用 Preference Activity

    
/**
 * Invoked when a menu item has been selected
 */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        // Case: Bring up the Preferences Screen
        case R.id.menu_prefs: // Preferences
            // Launch the Preference Activity
            Intent i = new Intent(this, AppPreferenceActivity.class);
            startActivity(i);
            break;

        case R.id.menu...:
            :
            break;

    }
    return true;
}

此外,您必须在 AndroidManifest XML 文件中定义所有的 Intent,如 清单 7 所示。


清单 7. 在 AndroidManifest.xml 中定义 Intent

    
:

<application android:icon="@drawable/icon" android:label="@string/app_name">

    :
    :
    
    <activity 
        android:name="AppPreferenceActivity" 
        android:label="Preferences">
    </activity>  

     :

</application>

回想一下,PreferenceActivity 使用 SharedPreferences 在用户与首选项屏幕交互时自动存储首选项。然后应用程序在执行各种任务时使用这些首选项。清单 8 展示了如何直接使用 SharedPreferences 来加载存储的首选项;关于加载的首选项在整个样例代码中是如何被使用的,您可以参考相应的样例代码。此外,清单 8 也展示了如何利用 SharedPreferences 直接存储首选项,以防您喜欢自己管理首选项(不是通过 PrefenceActivity),使用了一个 Editor

清单 8 展示了如何使用 SharedPreferences 加载已存储的首选项,以及如何使用 Editor 更改已存储的首选项。


清单 8. 使用 SharedPreferences

    
/////////////////////////////////////////////////////////////
// The following methods show how to use the SharedPreferences
/////////////////////////////////////////////////////////////

/**
 * Retrieves the Auto delete preference
 * @return the value of auto delete
 */
public boolean prefsGetAutoDelete() {
    boolean v = false;
    SharedPreferences sprefs = 
       PreferenceManager.getDefaultSharedPreferences(appContext); 
    String key = appContext.getString(R.string.prefs_autodelete_key);
    try {
        v = sprefs.getBoolean(key, false);
    } catch (ClassCastException e) {
    }
    return v;
}   

/**
 * Sets the auto delete preference
 * @param v the value to set
 */
public void  prefsSetAutoDelete(boolean v) {
    SharedPreferences sprefs = 
    PreferenceManager.getDefaultSharedPreferences(appContext); 
    Editor e = sprefs.edit();
    String key = appContext.getString(R.string.prefs_autodelete_key);               
    e.putBoolean(key, v);
    e.commit();
}

接下来,将介绍如何使用数据库来存储数据。

未完待续

感谢:http://hi.baidu.com/304580500/blog/item/04a246534690f51a0df3e37a.html

分享到:
评论

相关推荐

    android电话录音软件源码

    "android电话录音软件源码" 提供了一种实现这一功能的解决方案,允许用户在通话过程中录制声音,并将录音文件存储在本地或者上传至远程服务器。 首先,我们来看一下核心知识点: 1. **权限管理**:在Android系统中...

    【eoeAndroid特刊】第六期 数据通信-成为Android数据流大师

    在Android系统中,SD卡被广泛用作外部存储设备,用于存储应用程序数据、媒体文件等。 **SD卡特性:** - **高速读写:** 支持高速数据传输。 - **容量范围广:** 从几百MB到几百GB不等。 - **安全性:** 支持密码...

    k9-mail android2.1源码

    例如,它可能会使用到`Activity`、`Intent`、`BroadcastReceiver`等基础组件,以及`SQLite`数据库进行本地数据存储。同时,它利用`AsyncTask`进行异步任务处理,保证了用户界面的流畅性。 3. **网络通信技术** K9-...

    基于Android Studio实现的历史上的今天APP源码,Android 历史上的今天APP代码

    总之,这个项目是一个学习Android应用开发的好资源,特别是对于那些想深入理解Android Studio工作流程、网络请求处理、数据存储以及UI设计的初学者。通过分析和修改源码,开发者可以提升自己的编程技能,了解如何将...

    LinkChat:基于Wifi AP的Android共享平台

    **LinkChat:基于Wifi AP的Android共享平台** `LinkChat`是一个专为Android设备设计的共享平台,它利用了Wi-Fi直连(Wi-Fi Direct)技术来实现设备间的快速、直接的数据交换。Wi-Fi Direct是一种无线连接技术,允许...

    AP17110020009-AAD:APSSDC下的当前实习项目

    11. **网络编程**:理解Android中的网络访问限制,如AsyncTask、IntentService或使用现代的Retrofit、OkHttp库进行异步请求。 12. **权限管理**:了解Android的运行时权限系统,如何在Marshmallow及以上版本请求...

    BitmapFun.zip

    BitmapFun.zip 文件是一个与 Android 和 Java 开发相关的资源包,主要包含了用于图像处理和展示的类和资源。...对于想要深入理解Android图像处理和应用架构的开发者来说,BitmapFun.zip是一个很好的学习资源。

    wifi扫描器

    此外,还需要处理数据存储问题,可能使用SQLite数据库或文件系统来保存扫描记录。 在实际使用中,【WiFi扫描器】可以帮助用户定位网络问题。例如,如果发现家中的WiFi信号在某些区域较弱,可以利用应用记录的数据...

    基于JAVA开发的简约型电商app

    5. **数据持久化**:SQLite数据库用于本地数据存储,学习如何创建表、插入、查询和更新数据是必需的。另外,还可以考虑使用Room库来简化操作。 6. **网络通信**:使用Retrofit或OkHttp进行API调用,获取远程服务器...

    FoxFileApp:ap comp sci 项目

    这个项目为学习者提供了一个很好的机会,不仅能够实践Java编程,还能深入理解Android应用开发的全貌,包括用户体验设计、数据管理、网络通信等多个方面。通过参与这样的项目,开发者可以提升自己的编程技巧,增强...

    基于JAVA开发的化妆品商城app

    在实际开发中,开发者首先会设计数据库模型,包括商品、用户、订单等实体,并使用Room将这些数据存储在本地。接着,通过Retrofit与后台服务器交互,获取商品列表、用户信息以及处理订单支付。在UI设计上,可能会采用...

    高德地图api离线化,支持uniapp,web,触屏操作

    3. **离线数据库**:为了实现离线搜索和路径规划,可能需要构建一个本地数据库来存储地理信息和道路数据。这可能涉及到SQLite或其他轻量级数据库技术的使用。 4. **平台适配**:uniAPP是一个跨端开发框架,支持快速...

    使用Ionic2制作移动应用

    - **SQLite**:用于更复杂的数据存储需求。 - **Cordova插件**:如`cordova-plugin-sqlite2`用于支持SQLite数据库。 ##### 第十一课:获取数据,Observable和Promise - **HTTP客户端**:Angular提供的HttpClient...

    HelloNotes

    在Android开发中,ListView和Layout是两个至关重要的组件,它们被广泛用于构建用户界面,特别是在创建数据密集型应用时,如“HelloNotes”这样的备忘录应用。本篇将深入探讨这两个组件以及如何利用它们来实现存储...

    AP-HW:我把我的 comp sci hw 放在哪里

    "AP-HW:我把我的 comp sci hw 放在哪里"这个标题暗示了一个关于如何存储和管理计算机科学作业的问题,可能是一个学生在寻找最佳的实践方法。在描述中提到的“接入点硬件”可能是指用于访问或传输文件的设备或网络...

    download-aws-s3:实施下载Amazon Web Service(AWS)的解决方案-S3

    在IT行业中,Amazon Web Services(AWS)是全球领先的云服务提供商,其S3...理解S3的基础知识和如何使用此类工具是掌握云存储管理和数据处理的关键技能,对于任何在AWS环境中工作的IT专业人员来说都是必不可少的。

    uni-app开发实例

    uni-app提供了丰富的组件库和API,如`uni.getStorageSync`进行本地存储操作,`uni.showActionSheet`展示操作菜单,`uni.scanCode`调起扫码功能等。 7. **uniappTest项目** - 压缩包中的"uniappTest"可能是一个实际...

Global site tag (gtag.js) - Google Analytics