一.SharedPreferences类数据存储:

   SharedPreferences是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。实现SharedPreferences存储的步骤如下:

(1)根据Context获取SharedPreferences对象

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

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

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

示例代码如下:实现简单的登陆界面的记住密码和用户名的功能:

(1)MainActivity.java

package com.example.l0827_sharedpereferences;
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
public class MainActivity extends Activity {
    private Button btn;
    private CheckBox cb;
    private EditText et1, et2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et1 = (EditText) findViewById(R.id.et1);
        et2 = (EditText) findViewById(R.id.et2);
        btn=(Button) findViewById(R.id.btn);
        cb=(CheckBox) findViewById(R.id.cb);
        // 根据Context获取SharedPreferences对象
        SharedPreferences sp = MainActivity.this.getSharedPreferences("info", Activity.MODE_PRIVATE);
        //设置编辑框的信息
        et1.setText(sp.getString("username", ""));
        et2.setText(sp.getString("userpassword", ""));
        btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if(cb.isChecked()){
                    onSave();
                    onDestroy();
                }else{
                    onDestroy();
                }
            }
        });
    }
    public void onSave() {
        SharedPreferences sp = getSharedPreferences("info", Activity.MODE_PRIVATE);
        //利用edit()方法获取Editor对象
        SharedPreferences.Editor editor = sp.edit();
        //通过Editor对象存储key-value键值对数据
        editor.putString("username", et1.getText().toString());
        editor.putString("userpassword", et2.getText().toString());
        //通过commit()方法提交数据
        editor.commit();
    }
}

(2)效果图:

初始界面:

191852384.jpg

输入用户名和密码,但未点击“记住密码”:

191852373.jpg

点选“记住密码”:

191852181.jpg

则可以看到data/data/包名/shared_prefs/目录下出现了info.xml文件:

191852828.jpg

我们把该文件到处,用浏览器打开的效果如下:

191852307.jpg


由上面的说明可以得出如下结论:

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


二.内部存储

   内部存储即将数据存在应用程序目录中,这些数据都是应用程序私有的,除了本应用之外的应用程序不能访问,当用户卸载这个应用程序之后这些内部存储的数据也将被删除。路径为“data/data/应用程序包名/”。

   用内部方法存储数据的过程:

(1)调用OpenFileOutput方法,传入文件名和操作模式两个参数,返回一个FileOutputStream对象。之后系统会自动的在上面所说的目录下创建一个files目录以存储文件;

(2)write方法向文件中写数据;

(3)close方法关闭流。

   参数中常用的模式常数有:

(1)MODE_PRIVATE:创建文件并把数据设为私有;

(2)MODE_APPEND:内容添加模式;

(3)MODE_EORLD_READABLE:全设备可读;

(4)MODE_EORLD_WRETEABLE:全设备可写;(3和4不用,太不安全了)

代码如下:

(1)MainActivity.java

package com.example.l0827_inner;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //文件名
        String fileName = "hs";
        //文件内容
        String content = "HelloWorld";
         try {
         FileOutputStream fos = openFileOutput(fileName, MODE_PRIVATE);
         fos.write(content.getBytes());
         fos.close();
        } catch (FileNotFoundException e) {
       e.printStackTrace();
        } catch (IOException e) {
         e.printStackTrace();
         }
        try {
            FileInputStream fis = openFileInput(fileName);
            BufferedReader br = new BufferedReader(new InputStreamReader(fis));
            String line = null;
            StringBuffer sb = new StringBuffer();
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
            System.out.println(sb.toString() );
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

(2)效果:

194923385.jpg

194923309.jpg


三.外部存储

   每一个Android设备都支持一个共享的外部存储空间,其存储的数据是全局可读的,并且可以被用户通过与PC机相连的方式手动修改,所以是很不安全的,系统的配置信息等私有信息是不会存储在外部空间的。

   若向外部存储空间存储数据需要用到IO流的操作,也就是以前学习java中的文件的读写问题,除此之外还需要注意的是要增加一个权限:

   WRITE_EXTERNAL_STORAGE权限。

示例如下:

(1)MainActivity.java

package com.example.l0827_outer;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import android.app.Activity;
import android.os.Bundle;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 创建File对象
        File file = new File("mnt/sdcard/anjoyo/hs.txt");
        if (!file.exists()) {
            File f = file.getParentFile();// 返回上一级目录
            if (!f.exists()) {
                f.mkdir();// 创建目录
            }
            try {
                file.createNewFile();// 创建文件
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 写入数据
                                     
        try {
            OutputStream os = new FileOutputStream(file);
            os.write(new String("Good").getBytes());
            os.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

(2)效果:

203823547.jpg


四.SQLite数据库存储

(1)MainActivity.java

package com.example.l0827_sqlitedb;
import android.app.ListActivity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends ListActivity {
              
    private MySQLite sqLite;
    private SQLiteDatabase dbWriter;
    private SQLiteDatabase dbReader;
    private SimpleCursorAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sqLite = new MySQLite(this);
        dbWriter = sqLite.getWritableDatabase();// 实现数据库的可写权限
        dbReader = sqLite.getReadableDatabase();// 实现数据库的可读权限
        // addDB();
        // updateDB();
        adapter = new SimpleCursorAdapter(this, R.layout.cell, null,
                new String[] { "title", "content" }, new int[] { R.id.tv1,
                        R.id.tv2 });
        setListAdapter(adapter);
        addDB();
        selectDB();
    }
    public void addDB() {
        ContentValues cv = new ContentValues();
        cv.put("title", "Helloword111");
        cv.put("content", "欢迎大家111");
        dbWriter.insert("user", null, cv);// 插入到数据库
    }
    public void updateDB() {
        ContentValues cv = new ContentValues();
        cv.put("title", "Hello");
        cv.put("content", "大家好");
        dbWriter.update("user", cv, "_id=2", null);
    }
    public void deleteDB() {
        dbWriter.delete("user", "_id=4", null);
    }
    public void selectDB() {
        // Cursor
        Cursor cursor = dbReader.query("user", null, null, null, null, null,
                null);
        // 重新适配
        adapter.changeCursor(cursor);
        while (cursor.moveToNext()) {
            System.out
                    .println(cursor.getString(cursor.getColumnIndex("title")));
            System.out.println(cursor.getString(cursor
                    .getColumnIndex("content")));
        }
    }
}

(2)MySQLite.java

package com.example.l0827_sqlitedb;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MySQLite extends SQLiteOpenHelper {
    public MySQLite(Context context) {
        super(context, "hs.db", null, 2);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE user( _id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL)");
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS user");// 如果数据库存在了这个表,那么删除这个表,重新创建
        db.execSQL("CREATE TABLE user( _id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT NOT NULL )");
    }
}