精华内容
下载资源
问答
  • Android 数据持久化

    2016-06-28 10:06:17
    Android数据持久化

    1.数据库SQLite
    处理大量数据以及与数据有关的逻辑时使用
    数据库数据文件data/data/packageName/datebases/test.db
    platform tools目录 adb, sqlite3

    给予权限才能看到.db
    adb shell 
    su -c "chmod 777 /data"
    su -c "chmod 777 /data/data"

    查看数据文件用sqlite3
    SELETE * FROM table;(分号)http://jingyan.baidu.com/article/c843ea0b9bbf1b77931e4ad4.html
    2.轻量级处理SharedPreferences
    适合app默认配置的保存(初始化时使用)

    public static void put(Context context, String key, Object object) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
    
        if (object instanceof String) {
            editor.putString(key, (String) object);
    
        } else if (object instanceof Integer) {
            editor.putInt(key, (Integer) object);
    
        } else if (object instanceof Boolean) {
            editor.putBoolean(key, (Boolean) object);
    
        } else if (object instanceof Float) {
            editor.putFloat(key, (Float) object);
    
        } else if (object instanceof Long) {
            editor.putLong(key, (Long) object);
    
        } else {
            editor.putString(key, object.toString());
    
        }
        SharedPreferencesCompat.apply(editor);
    }

    public static Object get(Context context, String key, Object defaultObject) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        if (defaultObject instanceof String) {
            return sp.getString(key, (String) defaultObject);
    
        } else if (defaultObject instanceof Integer) {
            return sp.getInt(key, (Integer) defaultObject);
    
        } else if (defaultObject instanceof Boolean) {
            return sp.getBoolean(key, (Boolean) defaultObject);
    
        } else if (defaultObject instanceof Float) {
            return sp.getFloat(key, (Float) defaultObject);
    
        } else if (defaultObject instanceof Long) {
            return sp.getLong(key, (Long) defaultObject);
    
        }
        return null;
    }

    3.ContentProvider
    跨应用共享数据和使用系统数据如联系人,图片,视频,音频

    //query 获取联系人
    ContentResolver contentResolver = this.getContentResolver();
    Cursor cursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null,null);
    if(cursor!=null) {
        while (cursor.moveToNext()) {
            int index = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
            String name = cursor.getString(index);
            String phone = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        }
    }

    4.文件I/O
    java.io.FileInputStream和java.io.FileOutputStream这两个类来实现对文件的读写(导出文件使用,不适合做数据交互)
    5.网络请求服务器数据
    少量涉及安全的数据需要实时获取并保存在服务器

    展开全文
  • Android数据持久化

    2017-04-28 11:09:12
    Android中经常会遇到操作数据的功能,所以Android数据持久化是一个挺重要的知识点 Android 数据持久化有四种方式 1.文件存储(内部存储,外部存储)。 2.SharedPreferences。 3.Sqlite数据库。 4.网络存储(服务器)。 ...

     

    Android中经常会遇到操作数据的功能,所以Android数据持久化是一个挺重要的知识点
    Android 数据持久化有四种方式
    1.文件存储(内部存储,外部存储)。
    2.SharedPreferences。
    3.Sqlite数据库。
    4.网络存储(服务器)。




    因为Sqlite数据库和网络存储(服务器)在其他章节中已讲述过,所以本章节重点讲述文件存储和SharedPreferences存储




    文件存储
    文件存储不对存储的内容进行任何的格式化处理,所有数据都是原封不动地保存到文件当中的,因而它比较适合用于存储一些简单的文本数据或二进制数据亦或是图片。
    1.内存存储(/data/data/包名/files/文件名)




    1.1.openFileOutput方法(存储字符串数据)
    openFileOutput(name,mode):
    name:是文件名,注意这里指定的文件名不可以包含路径,因为所有的文件都是默认存储到/data/data//files/(等价于getFilesDir())目录下的


    mode:是文件的操作模式,


    MODE_PRIVATE:默认的操作模式,同名文件内容会被覆盖。


    MODE_APPEND则表示如果该文件已存在就往文件里面追加内容,不存在就创建新文件。


    还有另外两种(android4.2被废弃),MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE,这两种模式表示允许其他的应用程序对我们程序中的文件进行读写操作。




    openFileOutput()方法返回的是一个FileOutputStream对象,得到了这个对象之后就可以使用Java流的方式将数据写入到文件中了。








    //写入数据

     

    public void write() {
    
    String data="Android数据持久化操作之内存存储";
    FileOutputStream out=null;
    BufferedWriter writer=null;
    try{
    out=openFileOutput("name.txt", Context.MODE_PRIVATE);
    writer=new BufferedWriter(new OutputStreamWriter(out));
    writer.write(data);
    }catch(IOException e){
    e.printStackTrace();
    }finally{
    try{
    if(writer!=null){
    writer.close();
    }
    } catch (IOException e) {
    
    }
    }
    }

     

     

     

     

     


    1.2.openFileInput方法(读取字符串数据)
    这个方法只接收一个参数,即要读取的文件名,使用openFileInput("filename")读取存放在/data/data//files目录应用私有的文件。该方法返回一个FileInputStream对象,得到了这个对象之后再通过Java流的方式就可以将数据读取出来了。




    //读取数据

     

     

     

     

     

     

    public String read() {
    FileInputStream in=null;
    BufferedReader reader=null;
    StringBuilder content=new StringBuilder();
    try {
    in=openFileInput("name.txt");
    reader=new BufferedReader(new InputStreamReader(in));
    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();
    }


     

    展开全文
  • android 数据持久化

    2015-12-31 15:06:18
    数据持久化即将数据持久保持下来,不因退出程序或关机而造成数据丢失.android提供了三种数据持久化方式,分别是: SharedPreferences 本地文件数据库 对于SharedPreferences 一般用来存储配置信息,其数据的...
    
    

    数据持久化即将数据持久保持下来,不因退出程序或关机而造成数据丢失.android提供了三种数据持久化方式,分别是:

    • SharedPreferences 
    • 本地文件
    • 数据库
    对于SharedPreferences 一般用来存储配置信息,其数据的存储方式为键值对即key:value,比如 age:23.它采用XML文件进行存储,该文件存储在data/data/包名
    /shared_prefs/文件夹下.当需要使用SharedPreferences来存储数据时,必须先获取该对象,获取该对象的方法如下:
    [java] view plaincopy
    1. SharedPreferences settings = (SharedPreferences)getSharedPreferences("shared", MODE_PRIVATE);   
    上述获取代码获取了指定文件夹下的shared.xml文件数据,如果该文件不存在,则创建该文件,获取该对象后,如果想写入数据还学要该类提供的编辑器工具,获取该工具的方法如下:
    [java] view plaincopy
    1. SharedPreferences.Editor editor = settings.edit();   
    获取编辑器后,我们便可以向配置文件中写入数据了,SharedPreferences支持多种数据类型,包括Boolean、String、int、float、long.写入数据代码如下:
    [html] view plaincopy
    1. editor.putString("name", "Simple");  
    2. editor.putInt("age", 23);  

    上述代码向SharedPreferences中写入了两项数据分别是:name和age,其值分别是Simple和23.写完数据后,还需提交数据,提交数据的方法如下:
    [html] view plaincopy
    1. editor.commit();  

    与写入数据相对于的是读取数据,读取数据前仍需获取SharedPreferences对象,获取该对象的方法与前面获取方法一样。读取数据的代码相对简单,代码如下:

    [html] view plaincopy
    1. name = settings.getString("name", "姓名");  
    2. age = settings.getInt("age", 20);  
    获取方法有两个参数,第一个参数为获取键值、第二参数为默认值。
    展开全文
  • android数据持久化

    2018-10-07 22:35:00
    android数据持久化分为三种:文件存储、SharedPreferences存储和数据库存储。 1.3 三种方式对比 数据持久化三种方式对比 方式 保存路径 涉及到的类 特点 文件存储 /data/data/...

    1、数据持久化

    1.1 定义

    数据持久化就是将内存中的瞬时数据保存到存储设备中,保证即使在手机或者是电脑关机的情况下,数据也不会丢失。

    1.2 方式

    在android中数据持久化分为三种:文件存储、SharedPreferences存储和数据库存储。

    1.3 三种方式对比

    数据持久化三种方式对比

    方式 保存路径 涉及到的类 特点
    文件存储 /data/data/<packagename>/files/ //从文件中读取数据
    Context.openFileInput(String fileName):FileInputStream 
    //将数据存储到文件中
    Context.openFileOutput(String fileName, int mode):FileOutputStream 
    不对存储的内容进行任何的格式化处理,比较合适存储一些简单的文本数据或二进制数据
    SharedPreferences存储 /data/data/<packagename>/shared_prefs/ Context.getSharedPreferences(String name, int mode):SharedPreferences
    Activity.getPreferences(int mode):SharedPreferences
    PreferenceManager.getDefaultSharedPreferences(Context context):SharedPreferences
    使用键值对的方式来存储数据,保存数据更加方便。数据以明文的方式保存在文件中,需要加密
    数据库 /data/data/<packagename>/databases/ SqLiteOpenHelper类、SQLiteDatabase类 可以保存大量复杂的关系型数据 


    2、文件存储

    2.1 存储数据

        调用的方法:Context.openFileOutput(String fileName, int mode):FileOutputStream

        其中,mode的值有两个,分别为:Context.MODE_PRIVATE和Context.MODE_APPEND

        Context.MODE_PRIVATE:为默认模式,表示当指定相同文件名的时候,会覆盖原有文件。

        Context.MODE_APPEND:表示文件已经存在时,会将内容追加到之前的文件中。

        下面是一个例子:

        /**
         * 保存数据
         * @param view
         */
        public void saveData(View view){
            String text = inputText.getText().toString();
            if(!TextUtils.isEmpty(text)){
                FileOutputStream fileOutputStream = null;
                BufferedWriter fileWriter = null;
                try{
    //                fileOutputStream = FilePersistenceActivity.this.openFileOutput(FILENAME, Context.MODE_PRIVATE);//每次文件都是会被覆盖掉
                    fileOutputStream = FilePersistenceActivity.this.openFileOutput(FILENAME, Context.MODE_APPEND);//在原有文件的基础之上追加内容
                    fileWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream));
                    fileWriter.write(text);
                    fileWriter.write("\r\n");
                }catch (FileNotFoundException e){
                    Log.e(TAG, "saveData: 文件不存在");
                }catch (IOException e){
                    Log.e(TAG, "saveData: IOException"+e.getMessage() );
                }finally {
                    try {
                        if (null != fileWriter) {
                            fileWriter.close();
                        }
                    }catch (IOException e){
                        Log.e(TAG, "finally: IOException"+e.getMessage() );
                    }
                    inputText.setText("");
                }
            }
        }

    2.2 读取数据

        从文件中读取数据Context.openFileInput(String fileName):FileInputStream

         示例代码:

        /**
         * 读取数据
         * @param view
         */
        public void readData(View view){
            FileInputStream fileInputStream = null;
            BufferedReader bufferedReader = null;
            try {
                fileInputStream = FilePersistenceActivity.this.openFileInput(FILENAME);
                bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
                String readLine = null;
                StringBuffer stringBuffer = new StringBuffer();
                while (!TextUtils.isEmpty(readLine = bufferedReader.readLine())){
                    stringBuffer.append("\r\n");
                    stringBuffer.append(readLine);
                }
                inputtedText.setText(stringBuffer.toString());
            }catch (FileNotFoundException e){
                Log.e(TAG, "readData:" +e.getMessage());
            }catch (IOException e){
                Log.e(TAG, "IOException:" +e.getMessage());
            }finally {
                try {
                    if(null != bufferedReader){
                        bufferedReader.close();
                    }
                }catch (IOException e){
                    Log.e(TAG, "IOException:" +e.getMessage());
                }
            }
        }
    

    3、SharedPreferences

        3.1 三种不同的实现方式对比

        在这个程序中,对应的包名为:ed84947b9b021aa54b48d1a03e62f7159ce.jpg

    三种不同的实现方式对比

    实现方式 方法解析 保存的文件名
    Context.getSharedPreferences(String name, int mode):SharedPreferences

    name:SharedPreferences文件的名称.

    mode:目前只有MODE_PRIVATE这一种模式,是默认操作,表示只有当前的程序才可以对此SharedPreference进行操作

    name所定义的名字

    53e61392518178bcb7ea928665b2094f8ac.jpg

    Activity.getPreferences(int mode):SharedPreferences  

    当前活动的类名作为文件名

    78a882827cb702e51620c9c75367418e8fe.jpg

    PreferenceManager.getDefaultSharedPreferences(Context context):SharedPreferences  

    当前应用程序包名作为前缀

    fe5307681c7a894482db9b89b909118e2f8.jpg

        3.2 保存数据

            调用SharedPreferences.Editor类,使用putXXX()方法,然后调用SharedPreferences.Editor的apply()即可。具体使用哪一个put方法,根据数据类型来决定。

        3.3 读取数据

            直接调用SharedPreferences类的getXXX()方法。具体调用哪一个get方法,根据数据类型来决定。

    4、数据库

        Android主要使用Sqlite数据库作为系统默认数据库。

    4.1 主要涉及到的类

        主要涉及到SQLiteOpenHelper和SQLiteDatabase这两个类。SQLiteOpenHelper是一个接口,主要负责数据库的创建和升级。SQLiteDatabase类主要负责执行对应的sql语句。

        SQLiteOpenHelper接口有onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)这两个方法需要重写,onCreate方法在数据库初次被创建时调用。onUpgrade方法,在传入的newVersion参数发生改变的时候,进行调用。newVersion参数,在SQLiteOpenHelper的构造方法中传入。

        其中SQLiteDatabase可以通过SQLiteOpenHelper类的getWritableDatabase()和getReadableDatabase()这两个方法获得。当数据库不可以写入的时候,调用getWritableDatabase()会出现异常。调用这两个方法的过程中,会创建或者打开已有的数据库文件。

    4.2 执行增删改查所对应的方法

        对于数据库的增加、修改、和删除操作都可以直接调用execSQL方法,但是查询就需要调用rawQuery方法。

        具体事例如下:

    sqLiteDatabase.exeSql("delete from book where name = ?",new String[]{"java"});
    sqLiteDatabase.exeSql("update book set price = ? where name = ?",new String[]{"123","java"});
    sqLiteDatabase.exeSql("insert into book(name,author,price)values(?,?,?);",new String[]{"java","cxy","23.56"});
    Cursor cursor = sqLiteDatabase.rawQuery("select * from book",null);

    4.3 数据库中主要的数据类型

        integer表示整形,real表示浮点型,text表示文本类型,blob表示二进制类型。

    转载于:https://my.oschina.net/u/2253892/blog/2223637

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,859
精华内容 743
关键字:

android数据持久化