`

理解 Android 本地数据存储 API 利用首选项、SQLite 和内部及外部内存 API

阅读更多

http://www.ibm.com/developerworks/cn/xml/x-androidstorage/

 

存储应用程序首选项

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

 

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)。

使用 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();
}

 

MainActivity 插入到数据库中

String fname = prefsGetFilename();
if (fname != null && fname.length() > 0) {
    buffer = getAsset(fname);
    // Parse the JSON file
    String friendslist = new String(buffer);
    final JSONObject json = new JSONObject(friendslist);
    JSONArray d = json.getJSONArray("data");
    int l = d.length();
    for (int i2=0; i2<l; i2++) {
        JSONObject o = d.getJSONObject(i2);
        String n = o.getString("name");
        String id = o.getString("id");
        dbHelper.insert(id, n);
    }
    // Only the original owner thread can touch its views                           
    MainActivity.this.runOnUiThread(new Runnable() {
        public void run() {
            friendsArrayAdapter.notifyDataSetChanged();
        }
    });         
}

MainActivity Select All 和将数据绑定到 ListView

final ArrayList<Friend> dbFriends = dbHelper.listSelectAll();
if (dbFriends != null) {
    // Only the original owner thread can touch its views                           
    MainActivity.this.runOnUiThread(new Runnable() {
        public void run() {
            friendsArrayAdapter = 
            new FriendsArrayAdapter(
                MainActivity.this, R.layout.rowlayout, dbFriends);
            listView.setAdapter(friendsArrayAdapter);
            friendsArrayAdapter.notifyDataSetChanged();
        }
    });
}   

 从本地私有存储器读取数据   

/**
 * Writes content to internal storage making the content private to 
 * the application. The method can be easily changed to take the MODE 
 * as argument and let the caller dictate the visibility: 
 * MODE_PRIVATE, MODE_WORLD_WRITEABLE, MODE_WORLD_READABLE, etc.
 * 
 * @param filename - the name of the file to create
 * @param content - the content to write
 */
public void writeInternalStoragePrivate(
        String filename, byte[] content) {
    try {
        //MODE_PRIVATE creates/replaces a file and makes 
        //  it private to your application. Other modes:
        //    MODE_WORLD_WRITEABLE
        //    MODE_WORLD_READABLE
        //    MODE_APPEND
        FileOutputStream fos = 
           openFileOutput(filename, Context.MODE_PRIVATE);
        fos.write(content);
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

 从内部私有存储器读取数据

				
/**
 * Reads a file from internal storage
 * @param filename the file to read from
 * @return the file content
 */
public byte[] readInternalStoragePrivate(String filename) {
    int len = 1024;
    byte[] buffer = new byte[len];
    try {
        FileInputStream fis = openFileInput(filename);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int nrb = fis.read(buffer, 0, len); // read up to len bytes
        while (nrb != -1) {
            baos.write(buffer, 0, nrb);
            nrb = fis.read(buffer, 0, len);
        }
        buffer = baos.toByteArray();
        fis.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return buffer;
}

 

从本地私有存储器删除数据

/**
 * Delete internal private file 
 * @param filename - the filename to delete
 */
public void deleteInternalStoragePrivate(String filename) {
    File file = getFileStreamPath(filename);
    if (file != null) {
        file.delete();
    }
}

 为公共数据使用设备的外部存储器

有了数据存储 API,您可以使用外部存储器存储数据。信息可以是私有的,您可以有选择地让其他应用程序对之具有读或写的访问权限。本节您将对此 API 进行编程,以便使用包括 getExternalStorageState()、getExternalFilesDir()、getExternalStorageDirectory() 和 getExternalStoragePublicDirectory() 在内的很多 API 来存储公共数据。您为公共数据使用下面的路径:/Android/data/<package_name>/files/。

在使用外部存储器之前,必须看看它是否可用,是否可写。下面两个代码片段展示了测试这些条件的帮助器方法。清单 23 测试外部存储器是否可用。

测试外部存储器是否可用   

/**
 * Helper Method to Test if external Storage is Available
 */
public boolean isExternalStorageAvailable() {
    boolean state = false;
    String extStorageState = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(extStorageState)) {
        state = true;
    }
    return state;
}

 测试外部存储器是否只可读

/**
 * Helper Method to Test if external Storage is read only
 */
public boolean isExternalStorageReadOnly() {
    boolean state = false;
    String extStorageState = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) {
        state = true;
    }
    return state;
}

 写到外部内存

/**
 * Write to external public directory
 * @param filename - the filename to write to
 * @param content - the content to write 
 */
public void writeToExternalStoragePublic(String filename, byte[] content) {

    // API Level 7 or lower, use getExternalStorageDirectory() 
    //  to open a File that represents the root of the external 
    // storage, but writing to root is not recommended, and instead 
    // application should write to application-specific directory, as shown below.

    String packageName = this.getPackageName();
    String path = "/Android/data/" + packageName + "/files/";

    if (isExternalStorageAvailable() && 
       !isExternalStorageReadOnly()) {
        try {
            File file = new File(path, filename);
            file.mkdirs();
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(content);
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 从外部内存读取数据

/**
 * Reads a file from internal storage
 * @param filename - the filename to read from
 * @return the file contents
 */
public byte[] readExternallStoragePublic(String filename) {
    int len = 1024;
    byte[] buffer = new byte[len];
    String packageName = this.getPackageName();
    String path = "/Android/data/" + packageName + "/files/";

    if (!isExternalStorageReadOnly()) {     
        try {
            File file = new File(path, filename);            
            FileInputStream fis = new FileInputStream(file);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int nrb = fis.read(buffer, 0, len); //read up to len bytes
            while (nrb != -1) {
                baos.write(buffer, 0, nrb);
                nrb = fis.read(buffer, 0, len);
            }
            buffer = baos.toByteArray();
            fis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return buffer;
}

外部内存删除文件

/**
 * Delete external public file 
 * @param filename - the filename to write to
 */
void deleteExternalStoragePublicFile(String filename) {
    String packageName = this.getPackageName();
    String path = "/Android/data/" + packageName + "/files/"+filename;
    File file = new File(path, filename);
    if (file != null) {
        file.delete();
    }
}

  处理外部存储器需要特殊的权限 WRITE_EXTERNAL_STORAGE,它通过 AndroidManifest.xml 请求得到

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 

外部存储 API 通过根据文件类型(比如 Pictures、Ringtones)将文件存储在预先确定的目录中,允许您公共地存储文件。本文没有介绍这种方法,但是您应该熟悉它。此外,记住外部存储器中的文件任何时候都可能消失。

如果您具有不需要长期永久保存的临时文件,那么可以将这些文件存储在高速缓存中。高速缓存是一种特殊的内存,可以用于存储中小型数据(少于兆字节),但是您一定要知道,取决于有多少内存可用,高速缓存的内容任何时候都可能被清除。

检索到内部内存高速缓存的路径

/**
 * Helper method to retrieve the absolute path to the application 
 * specific internal cache directory on the file system. These files 
 * will be ones that get deleted when the application is uninstalled or when 
 * the device runs low on storage. There is no guarantee when these 
 * files will be deleted.
 * 
 * Note: This uses a Level 8+ API.
 * 
 * @return the absolute path to the application specific cache 
 * directory
 */
public String getInternalCacheDirectory() {
    String cacheDirPath = null;
    File cacheDir = getCacheDir();
    if (cacheDir != null) {
        cacheDirPath = cacheDir.getPath();
    }
    return cacheDirPath;        
}

检索到外部内存高速缓存的路径

/**
 * Helper method to retrieve the absolute path to the application 
 * specific external cache directory on the file system. These files 
 * will be ones that get deleted when the application is uninstalled or when 
 * the device runs low on storage. There is no guarantee when these 
 * files will be deleted.
 * 
 * Note: This uses a Level 8+ API.
 * 
 * @return the absolute path to the application specific cache 
 * directory
 */
public String getExternalCacheDirectory() {
    String extCacheDirPath = null;
    File cacheDir = getExternalCacheDir();
    if (cacheDir != null) {
        extCacheDirPath = cacheDir.getPath();
    }
    return extCacheDirPath;     
}
分享到:
评论

相关推荐

    实验项目报告第7章.doc android studio SQLite数据库的创建、增删改查操作 SharedPreferen

    【Android Studio 中 SQLite 数据库操作】 在 Android 开发中,SQLite 是一个常用的数据存储解决方案,...通过学习和实践,学生能够更好地理解和运用这些数据存储技术,为开发高质量的 Android 应用打下坚实的基础。

    Android平板本地数据excel的导入导出

    Android提供了多种存储数据的机制,包括内部存储、外部存储、SQLite数据库以及SharedPreferences等。对于大量的结构化数据,通常推荐使用SQLite数据库,因为它提供了一种高效、结构化的数据存储方式。 在Android...

    Android-API.rar_android_android 中

    在数据存储方面,Android提供了多种选项,包括SQLite数据库、SharedPreferences、内部/外部存储以及ContentProvider。SQLite是轻量级的关系型数据库,适用于应用内的数据存储;SharedPreferences适合保存简单的键值...

    Android_api(3).zip_android

    通过阅读API文档,开发者可以了解如何创建活动(Activity)、广播接收器(Broadcast Receiver)、服务(Service)、内容提供者(Content Provider),以及如何处理视图(View)、布局(Layout)和数据存储等。...

    Android数据保存

    本主题将深入探讨Android中的四种主要数据保存方法:内部文件存储、外部SD卡存储、首选项(SharedPreferences)存储以及SQLite数据库存储。 1. **内部文件存储** Android提供了一种方式来在应用的私有目录中保存...

    Android存储机制的应用研究.pdf

    例如,轻量级的用户设置适合首选项,小量的非结构化数据可以存于内部文件,媒体文件则应存储在外部存储,而结构化数据和需要高效查询的情况则推荐使用SQLite数据库。 在使用这些存储机制时,开发者需要注意数据同步...

    Android、教程<经典> 7 数据存储

    Android提供了两种文件存储方式:内部存储和外部存储。内部存储的数据对用户不可见,且随着应用的卸载被删除;外部存储则允许用户访问,但需要处理文件权限问题。使用`openFileOutput()`和`openFileInput()`可以读写...

    xamarin学习笔记A09(安卓数据简单存储)

    在“xamarin学习笔记A09(安卓数据简单存储)”中,你将深入学习如何在Xamarin.Android项目中实现这些数据存储方式,包括创建SQLite数据库、使用SharedPreferences、操作内部和外部文件,以及理解ContentProvider的...

    sqlite数据库的移植和使用

    SQLite是一个开源的、轻量级的、自包含的嵌入式SQL数据库引擎,适用于各种操作系统,包括Linux和Android等。它的优点在于不依赖外部数据库服务器,可以被直接集成到应用程序中,提供数据存储功能。 移植SQLite到...

    轻型的数据库sqlite工具

    1. **轻量级**: SQLite不需要独立的服务器进程,数据库文件可以直接存储在用户文件系统中,这使得它对内存和磁盘空间的需求非常低。 2. **自包含**: SQLite是完全自包含的,不依赖于任何外部库,只需要一个简单的...

    sqlite-amalgamation-3.6.18.tar.gz_sqlite_sqlite 3 6 18 _sqlite

    对于开发者来说,理解SQLite的API接口和使用方法至关重要,这样才能有效地利用其功能来存储和管理应用程序的数据。 总的来说,SQLite 3.6.18是一个强大而可靠的数据库解决方案,尤其适合于需要离线数据存储、对数据...

    Android文件存储

    在Android系统中,文件存储是应用管理数据的重要方式之一,涵盖了多种不同的存储机制,包括内部存储、外部存储、SQLite数据库、SharedPreferences以及ContentProvider等。这些方法各有特点,适用于不同的数据存储...

    Android 文件存储

    Android提供了多种存储方式,包括内部存储、外部存储(SD卡)以及共享首选项等。下面我们将深入探讨Android中的文件存储机制及其相关知识点。 1. **内部存储** - **内部存储** 是应用程序的私有存储空间,只能由该...

    Notes_记事本Android_android_

    在数据存储方面,Android提供了多种方式,如SQLite数据库、SharedPreferences、内部/外部存储以及最近引入的Room库。对于记事本应用,SQLite数据库是最常用的选择,因为它能支持结构化的数据存储,便于管理和检索...

    sqlite-autoconf-3150200.tar.gz

    SQLite是一款开源、轻量级的嵌入式关系型数据库管理系统,广泛应用于各种操作系统,包括Linux、Windows和Android等。这个“sqlite-autoconf-3150200.tar.gz”文件是一个包含SQLite源代码的压缩包,版本号为3150200。...

    ApiDemos大全 android控件例子代码

    **ApiDemos大全:深入理解Android控件与API实例** `ApiDemos`是Android SDK中的一个示例项目,它包含了大量的Android API演示,对于初学者来说是一个非常宝贵的资源。这个项目展示了Android平台上各种控件的用法...

    Android文件目录及文件访问权限等详解Demo

    3. **外部私有存储(External Private Storage)**:自Android 6.0(API级别23)起,应用可以使用`getExternalFilesDir()`获取外部私有目录,用于存储应用数据,只有应用本身可以访问。 4. **SQLite数据库**:...

    eoeAndroid-data.zip_android

    9. **Android Jetpack DataStore**:作为Android Jetpack的一部分,DataStore是一种新的数据存储选项,它提供了与SharedPreferences类似的API,但使用Kotlin协程和序列化来实现异步、类型安全的数据存储。...

    Android SDK 中文开发文档.pdf

    Android SDK文档详细介绍了如何从零开始编写一个Android应用,包括设置开发环境、理解组件模型、使用API接口、调试技巧以及发布应用的步骤。 综上所述,《Android SDK 中文开发文档》是Android开发者的重要参考资料...

Global site tag (gtag.js) - Google Analytics