首页 > 代码库 > Android中常用的三种存储方法浅析

Android中常用的三种存储方法浅析

Android中常用的三种存储方法浅析

Android中数据存储5种方式

1使用SharedPreferences存储数据

2文件存储数据

3SQLite数据库存储数据

4使用ContentProvider存储数据

5网络存储数据

在这里我只总结了三种我用到过的或即将可能用到的三种存储方法。

一、使用SharedPreferences存储数据

SharedPreferencesAndroid平台上一个轻量级的存储类,主要是保存一些常用的配置信息比如窗口状态,它的本质是基于XML文件存储key-value键值对数据SharedPreferences接口本身只能获取数据而不支持存储和修改,需要调用edit()方法获取它所对应的Editor对象实现。

Editor提供如下方法来向SharedPreferences写入数据。

A.SharedPreferences.Editor clear():清空SharedPreferences里所有数据;

B.SharedPreferences.Editor putXXX(String key,xxx value):SharedPreferences存入指定key对应的数据;

C.SharedPreferences.editor remove(String key):删除SharedPreferences指定key对应的数据项;

D.Boolean commit():Editor编辑完成后,调用该方法提交修改。

 

下边介绍对SharedPreferences的简单读写,代码如下:

public class MainActivity extends Activity
{
   SharedPreferences preferences;
   SharedPreferences.Editor editor;
   @Override
   public void onCreate(Bundle savedInstanceState)
   {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      // 获取只能被本应用程序读、写的SharedPreferences对象
      preferences = getSharedPreferences("crazyit", MODE_PRIVATE);
      editor = preferences.edit();
      Button read = (Button) findViewById(R.id.read);
      Button write = (Button) findViewById(R.id.write);
      read.setOnClickListener(new OnClickListener()
      {
         @Override
         public void onClick(View arg0)
         {

//读取数据,当程序所读取的数据文件不存在的时候,程序返回默认值。
            // 读取字符串数据
            String time = preferences.getString("time", null);
            // 读取int类型的数据
            int randNum = preferences.getInt("random", 0);
            String result = time == null ? "您暂时还未写入数据" : "写入时间为:"
                  + time + "\n上次生成的随机数为:" + randNum;
            // 使用Toast提示信息
            Toast.makeText(MainActivity.this, result
                  , Toast.LENGTH_SHORT).show();
         }
      });
      write.setOnClickListener(new OnClickListener()
      {
         @Override
         public void onClick(View arg0)
         {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"
                  + "hh:mm:ss");

//写入数据,由于SharedPreferences并不支持Date类型的值,将Date转化字符串后写入。
            // 存入当前时间
            editor.putString("time", sdf.format(new Date()));
            // 存入一个随机数
            editor.putInt("random", (int) (Math.random() * 100));
            // 提交所有存入的数据
            editor.commit();
         }
      });
   }
}

SharedPreferences对象与SQLite数据库相比,免去了创建数据库,创建表,写SQL语句等诸多操作,相对而言更加方便,简洁。但是SharedPreferences也有其自身缺陷,比如其职能存储booleanintfloatlongString五种简单的数据类型,比如其无法进行条件查询等。所以不论SharedPreferences的数据存储操作是如何简单,它也只能是存储方式的一种补充,而无法完全替代如SQLite数据库这样的其他数据存储方式。 

 

其存储位置在/data/data/<包名>/shared_prefs目录下。

实现SharedPreferences存储的步骤如下:   

1根据Context获取SharedPreferences对象   

2利用edit()方法获取Editor对象。   

3通过Editor对象存储key-value键值对数据。   

4通过commit()方法提交数据。

 

二、文件存储数据

关于文件存储,Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。

文件可用来存放大量数据,如文本、图片、音频等。

默认位置:/data/data/<>/files/***.***

Content提供两种方法打开数据文件夹里的文件IO流:

(1)FileInputStream openFileInput(String name)

(2)FileOutputStream openFileOutput(String nameint mode)

openFileOutput()方法的第二参数用于指定操作模式,有四种模式,分别为:

Context.MODE_PRIVATE:该文件只能被当前程序读写;

Context.MODE_APPEND :以追加方式打开该文件,应用程序可以向该文件中追加内容;

Context.MODE_WORLD_READABLE :该文件的内容可以被其他程序读取;

Context.MODE_WORLD_WRITEABLE :该文件的内容可由其他程序读写。

Activity还提供了getCacheDir()getFilesDir()方法: getCacheDir()方法用于获取/data/data/<package name>/cache目录 getFilesDir()方法用于获取/data/data/<package name>/files目录

程序如下:

public class MainActivity extends Activity
{
   final String FILE_NAME = "crazyit.bin";
   @Override
   public void onCreate(Bundle savedInstanceState)
   {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      System.out.println(new StringBuilder("a").append("b").append("c")
            .toString());
      // 获取两个按钮
      Button read = (Button) findViewById(R.id.read);
      Button write = (Button) findViewById(R.id.write);
      // 获取两个文本框
      final EditText edit1 = (EditText) findViewById(R.id.edit1);
      final EditText edit2 = (EditText) findViewById(R.id.edit2);
      // write按钮绑定事件监听器
      write.setOnClickListener(new OnClickListener()
      {
         @Override
         public void onClick(View source)
         {
            // edit1中的内容写入文件中
            write(edit1.getText().toString());
            edit1.setText("");
         }
      });
      read.setOnClickListener(new OnClickListener()
      {
         @Override
         public void onClick(View v)
         {
            // 读取指定文件中的内容,并显示出来
            edit2.setText(read());
         }
      });
   }
   private String read()
   {
      try
      {
         // 打开文件输入流
         FileInputStream fis = openFileInput(FILE_NAME);
         byte[] buff = new byte[1024];
         int hasRead = 0;
         StringBuilder sb = new StringBuilder("");
         // 读取文件内容
         while ((hasRead = fis.read(buff)) > 0)
         {
            sb.append(new String(buff, 0, hasRead));
         }
         // 关闭文件输入流
         fis.close();
         return sb.toString();
      }
      catch (Exception e)
      {
         e.printStackTrace();
      }
      return null;
   }
   private void write(String content)
   {
      try
      {
         // 以追加模式打开文件输出流
         FileOutputStream fos = openFileOutput(FILE_NAME, MODE_APPEND);
         // FileOutputStream包装成PrintStream
         PrintStream ps = new PrintStream(fos);
         // 输出文件内容
         ps.println(content);
         // 关闭文件输出流
         ps.close();
      }
      catch (Exception e)
      {
         e.printStackTrace();
      }
   }
}

 

三、SQLite数据库存储数据

SQLite是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。

 

特点:

面向资源有限的设备,

没有服务器进程,

所有数据存放在同一文件中跨平台,

可自由复制。

 

数据库存储在 data/< 项目文件夹 >/databases/ 下。 Android 开发中使用 SQLite 数据库 Activites 可以通过 Content Provider 或者 Service 访问一个数据库。在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你只要继承 SQLiteOpenHelper 类,就可以轻松的创建数据库。

 

SQLiteOpenHelper 的子类,至少需要实现三个方法:

构造函数,调用父类 SQLiteOpenHelper 的构造函数。这个方法需要四个参数:上下文环境(例如,一个 Activity),数据库名字,一个可选的游标工厂(通常是 Null),一个代表你正在使用的数据库模型版本的整数。

2 onCreate()方法,它需要一个 SQLiteDatabase 对象作为参数,根据需要对这个对象填充表和初始化数据。

3 onUpgrage() 方法,它需要三个参数,一个 SQLiteDatabase 对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。

 

下面示例代码展示了如何继承 SQLiteOpenHelper 创建数据库:

public class DatabaseHelper extends SQLiteOpenHelper {    

  DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version)

  {     

    super(context, name, cursorFactory, version);     

     }     

     @Override    

     public void onCreate(SQLiteDatabase db) {     

         // TODO 创建数据库后,对数据库的操作     

     }     

     @Override    

 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {     

         // TODO 更改数据库版本的操作     

     }      

 @Override    

 public void onOpen(SQLiteDatabase db) {     

         super.onOpen(db);       

         // TODO 每次成功打开数据库后首先被执行     

     }     

 }

 

Android SDKplatform-tools目录下提供一个sqlite3.exe文件,是一个简单的SQLite数据库管理工具,类似于MySQL提供的命令行窗口。

 

 

 

 

 

 

 

 

Android中常用的三种存储方法浅析