Android数据存储概述

来源:互联网 发布:网络课件制作 编辑:程序博客网 时间:2024/06/05 11:22

一、SharedPreferences存储
应用程序保存少量数据时使用,且数据格式较简单,保存的数据主要是简单类型的Key-value键值对。例如保存应用程序的各种配置信息(是否打开音效、是否使用震动)等。

SharedPreference接口本身没有提供写入数据的能力,而是通过SharedPreferences的内部接口Editor来写入数据。

1)将数据存储到SharedPreferences中
获取SharedPreferences对象的方法:
& Context类中的getSharedPreference()方法
& Activity类中的getPreferences()方法
& PreferenceManager类中的getDefaultSharedPreference()方法

   // 获得SharedPreferences.Editor的对象   SharedPreferences.Editor editor = getSharedPreferences("shared",MODE_PRIVATE).edit();               //存储数据               editor.putString("name", "Happy");               editor.putInt("age", 18);                 //提交数据               editor.apply();

2)从SharedPreferences中读取数据

 SharedPreferences sharedPreferences = getSharedPreferences("shared", MODE_PRIVATE);                String name = sharedPreferences.getString("name", "" );                int age  = sharedPreferences.getInt("age",0 );                boolean gender = sharedPreferences.getBoolean("male", false);

二、File文件存储
文件存储,不对存储的内容进行任何格式化处理,所有的数据都原封不动地保存文件中,因此文件存储适合存储一些简单的文本数据或二进制数据。

1)存储数据到文件
Context类提供openFileOutput()方法,用于存储数据到指定的文件中。

 public void save(String inputText){        FileOutputStream out = null;        BufferedWriter writer = null;        try {            out = openFileOutput("data", Context.MODE_PRIVATE);            writer = new BufferedWriter(new OutputStreamWriter(out));            writer.write(inputText);        }catch (IOException e) {            e.printStackTrace();        }finally {            if (writer != null){                try {                    writer.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }

2)从文件中读取数据
Context类提供openFileInput()方法,用于从文件中读取数据。

 public String load(){        FileInputStream inputStream = null;        BufferedReader reader = null;        StringBuilder content = new StringBuilder();        try {            inputStream = openFileInput("data");            reader = new BufferedReader(new InputStreamReader(inputStream));            String line = " ";            while ((line = reader.readLine()) != null){                content.append(line);            }        }catch (IOException e) {            e.printStackTrace();        }finally {            if (reader != null){                try {                    reader.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return content.toString();    }

三、SQLite数据库存储
Android中创建数据库的步骤:
1)创建一个类继承SQLiteOpenHelper
2)创建数据库名字和数据库版本的常量
3)创建构造函数
4)实现onCreate()方法
5)实现onUpgrade()方法

public class PetDbHelper extends SQLiteOpenHelper {    public static final String LOG_TAG = PetDbHelper.class.getName();    //数据库名字    private static final String DATABASE_NAME = "shelter.db";    //数据库版本,如果更新了数据库须改变数据库版本    private static final int DATABASE_VERSION = 1;    //构造函数 用来实例化PetDbHelper    public PetDbHelper(Context context) {        super(context, DATABASE_NAME, null, DATABASE_VERSION);    }    /**     * 数据库第一次创建的时候调用     * @param db     */    @Override    public void onCreate(SQLiteDatabase db) {        String SQL_CREATE_PETS_TABLE = "CREATE TABLE " + PetContract.PetEntry.TABLE_NAME +"("                + PetContract.PetEntry._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "                + PetContract.PetEntry.COLUMN_PET_GENDER + " INTEGER NOT NULL, "                + PetContract.PetEntry.COLUMN_PET_NAME + " TEXT NOT NULL, "                + PetContract.PetEntry.COULMN_PET_BREED + " INTEGER NOT NULL, "                + PetContract.PetEntry.COLUMN_PET_WEIGHT + " INTEGER NOT NULL DEFAULT 0 );";        db.execSQL(SQL_CREATE_PETS_TABLE);    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {    }}

然后在Activity中实现数据库创建的操作
(ps,补充,SQLiteOpenHelper 中两个非常重要的实例方法,getWritableDatabase() 和 getReadableDatabase(),用来创建或者打开一个现有数据库,并返回一个可对数据库进行进行读写操作的对象。不同的是,如果磁盘已满,getReadableDatabase()方法返回的对象以只读方式打开数据库,getWritableDatabase()则抛出异常。)

PetDbHelper mDbHelper = new PetDbHelper(this);SQLiteDatabase db = mDbHelper.getWritableDatabase();

1)在数据库中插入数据

  ContentValues values = new ContentValues();        values.put(PetContract.PetEntry.COLUMN_PET_NAME,"Toto");        values.put(PetContract.PetEntry.COULMN_PET_BREED,"Terrier");        values.put(PetContract.PetEntry.COLUMN_PET_GENDER, PetContract.PetEntry.GENDER_FEMALE);        values.put(PetContract.PetEntry.COLUMN_PET_WEIGHT,7);        db.insert(PetContract.PetEntry.TABLE_NAME,null,values);

2)从数据库中读取数据
从数据库读取数据,需要使用query()方法,传递需要查询的条件。查询后返回一个Cursor对象
Cursor类:
Cursor代表数据库中各行内容的对象,返回的Cursour对象包含了查询结果的所有内容。注意Cursor使用完毕后必须关闭,否则会出现内存泄漏。
具体使用,示例代码:

SQLiteDatabase db = petDbHelper.getReadableDatabase(); String[] projection = {                PetEntry._ID,                PetEntry.COLUMN_PET_NAME,                PetEntry.COLUMN_PET_BREED,                PetEntry.COLUMN_PET_GENDER,                PetEntry.COLUMN_PET_WEIGHT };Cursor cursor = db.query(                PetEntry.TABLE_NAME,   // The table to query                projection,            // The columns to return                null,                  // The columns for the WHERE clause                null,                  // The values for the WHERE clause                null,                  // Don't group the rows                null,                  // Don't filter by row groups                null);                   // The sort order

3)删除数据库中的信息
SQL Injection(SQL注入):随着B/S模式应用开发的发展,使用这
种模式编写应用程序的程序员越来越多,但由于程序员的水平及经验参差不齐,相当大一部分程序员在编写代码时没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户提交一段数据库查询代码,根据程序返回的结构,获得某些想得知的数据,这就是所谓的SQL注入。

   SQLiteDatabase db = petDbHelper.getReadableDatabase();        String selection = PetEntry._ID + " LIKE ?";        String[] selectionArgs = {String.valueOf(selection) };        db.delete(PetEntry.TABLE_NAME,selection,selectionArgs);

4)更新数据库
当需要修改数据库中的某些数据时,使用update()方法。update结合了插入与删除语法。

SQLiteDatabase db = petDbHelper.getReadableDatabase();ContentValues values = new ContentValues();values.put(PetEntry.COLUMN_TABLE_NAME, title);String selection =  PetEntry._ID + " LIKE ?";db.update(PetEntry.COLUMN_TABLE_NAME, values, selection);

详细的数据库笔记:http://www.jianshu.com/p/ea41eacfcbed

原创粉丝点击