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

会挽雕弓如满月,西北望,射天狼。这篇文章主要讲述Android中常用的三种存储方法浅析相关的知识,希望能为你提供帮助。
android中常用的三种存储方法浅析
Android中数据存储有5种方式:
【1】使用SharedPreferences存储数据
【2】文件存储数据
【3】SQLite数据库存储数据
【4】使用ContentProvider存储数据
【5】网络存储数据
在这里我只总结了三种我用到过的或即将可能用到的三种存储方法。
一、使用SharedPreferences存储数据
SharedPreferences是Android平台上一个轻量级的存储类,主要是保存一些常用的配置信息比如窗口状态,它的本质是基于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("yyyy年MM月dd日 "
                                    + "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也有其自身缺陷,比如其职能存储boolean,int,float,long和String五种简单的数据类型,比如其无法进行条件查询等。所以不论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 name,int 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 的子类,至少需要实现三个方法:
1  构造函数,调用父类 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 SDK的platform-tools目录下提供一个sqlite3.exe文件,是一个简单的SQLite数据库管理工具,类似于mysql提供的命令行窗口。
 
 
 
 
 
 
 
【Android中常用的三种存储方法浅析】 






























































































































    推荐阅读