Android_数据存储详解

来源:互联网 发布:星游记网络大电影收益 编辑:程序博客网 时间:2024/05/23 19:12

Android_数据存储详解

一、概述:

Android系统主要提供三种数据存储方式,即文件存储、SharedPreferences存储以及数据库存储。当然也可以把数据保存在SD卡中,还可以利用网络存储数据。

二、文件存储:

①简介:

Context类提供openFileOutput()方法,可以用于将数据存储到指定的文件中。第一个参数是文件名(可不必指定文件路径,因为所有的文件都默认存储到/data/data/<package name>/files/目录下的),第二个参数是文件的操作模式,有两种方式可选,为MODE_PRIVATE和MODE_APPEND。

②实例:


public class FileTest extends Activity{final String FILE_NAME = "crazyit.bin";@Overridepublic 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(){@Overridepublic void onClick(View source){// 将edit1中的内容写入文件中write(edit1.getText().toString());edit1.setText("");}});read.setOnClickListener(new OnClickListener(){@Overridepublic 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包装成PrintStreamPrintStream ps = new PrintStream(fos);// 输出文件内容ps.println(content);// 关闭文件输出流ps.close();}catch (Exception e){e.printStackTrace();}}}

三、SharedPreferences存储:

①简介:

SharedPreferences是使用键值对的形式存储数据的,常见的由SharedPreferences保存的数据有如应用程序的各种配置信息等等。

②将数据存储到SharedPreferences中:

1、Context类中的getSharedPreferences()方法。
此方法接收两个参数,第一个是SharedPreferences文件的名称,如果指定的文件不存在则会创建一个,SharedPreferences文件都存放在/data/data/<package name>/shared_prefs/目录下。第二个参数用于指定操作模式。
2、Activity类中的getPreferences()方法。
3、perferenceManager类中的getDefaultPreferences()方法。

得到SharedPreferences对象后,就可以开始向SharedPreferences文件中存储数据,主要可以分为下面三步实现:

1、调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象。
2、向SharedPreferences.Editor对象添加数据。
3、调用commit()方法提交数据。

public class MainActivity extends Activity {private Button saveData;private Button restoreData;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);saveData = (Button) findViewById(R.id.save_data);restoreData = (Button) findViewById(R.id.restore_data);saveData.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit();editor.putString("name", "Tom");editor.putInt("age", 28);editor.putBoolean("married", false);editor.commit();}});restoreData.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE);String name = pref.getString("name", "");int age = pref.getInt("age", 0);boolean married = pref.getBoolean("married", false);Log.d("MainActivity", "name is " + name);Log.d("MainActivity", "age is " + age);Log.d("MainActivity", "married is " + married);}});}}

四、SD卡存储:

SD卡存储与文件存储的区别就是要检测是否有挂载SD卡,下面通过一个实例讲解:
public class SDCardTest extends Activity{final String FILE_NAME = "/husheng.bin";@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);// 获取两个按钮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(){@Overridepublic void onClick(View source){// 将edit1中的内容写入文件中write(edit1.getText().toString());edit1.setText("");}});read.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v){// 读取指定文件中的内容,并显示出来edit2.setText(read());}});}private String read(){try{// 如果手机插入了SD卡,而且应用程序具有访问SD的权限if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){// 获取SD卡对应的存储目录File sdCardDir = Environment.getExternalStorageDirectory();// 获取指定文件对应的输入流FileInputStream fis = new FileInputStream(sdCardDir.getCanonicalPath() + FILE_NAME);// 将指定输入流包装成BufferedReaderBufferedReader br = new BufferedReader(new InputStreamReader(fis));StringBuilder sb = new StringBuilder("");String line = null;// 循环读取文件内容while ((line = br.readLine()) != null){sb.append(line);}// 关闭资源br.close();return sb.toString();}}catch (Exception e){e.printStackTrace();}return null;}private void write(String content){try{// 如果手机插入了SD卡,而且应用程序具有访问SD的权限if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){// 获取SD卡的目录File sdCardDir = Environment.getExternalStorageDirectory();File targetFile = new File(sdCardDir.getCanonicalPath() + FILE_NAME);// 以指定文件创建 RandomAccessFile对象RandomAccessFile raf = new RandomAccessFile(targetFile, "rw");// 将文件记录指针移动到最后raf.seek(targetFile.length());// 输出文件内容raf.write(content.getBytes());// 关闭RandomAccessFileraf.close();}}catch (Exception e){e.printStackTrace();}}}

五、SQLite数据库:

下面通过一个实例,讲解SQLite的增、删、改、查和更新:

MyDatabaseHelper:

public class MyDatabaseHelper extends SQLiteOpenHelper {public static final String CREATE_BOOK = "create table Book ("+ "id integer primary key autoincrement, " + "author text, "+ "price real, " + "pages integer, " + "name text)";public static final String CREATE_CATEGORY = "create table Category ("+ "id integer primary key autoincrement, "+ "category_name text, "+ "category_code integer)";private Context mContext;public MyDatabaseHelper(Context context, String name,CursorFactory factory, int version) {super(context, name, factory, version);mContext = context;}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(CREATE_BOOK);db.execSQL(CREATE_CATEGORY);Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {db.execSQL("drop table if exists Book");db.execSQL("drop table if exists Category");onCreate(db);}}

MainActivity:
public class MainActivity extends Activity {private MyDatabaseHelper dbHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);Button createDatabase = (Button) findViewById(R.id.create_database);createDatabase.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {dbHelper.getWritableDatabase();}});Button addData = (Button) findViewById(R.id.add_data);addData.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("name", "The Da Vinci Code");values.put("author", "Dan Brown");values.put("pages", 454);values.put("price", 16.96);db.insert("Book", null, values);values.clear();values.put("name", "The Lost Symbol");values.put("author", "Dan Brown");values.put("pages", 510);values.put("price", 19.95);db.insert("Book", null, values);}});Button updateData = (Button) findViewById(R.id.update_data);updateData.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {SQLiteDatabase db = dbHelper.getWritableDatabase();ContentValues values = new ContentValues();values.put("price", 10.99);db.update("Book", values, "name = ?",new String[] { "The Da Vinci Code" });}});Button deleteButton = (Button) findViewById(R.id.delete_data);deleteButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {SQLiteDatabase db = dbHelper.getWritableDatabase();db.delete("Book", "pages > ?", new String[] { "500" });}});Button queryButton = (Button) findViewById(R.id.query_data);queryButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {SQLiteDatabase db = dbHelper.getWritableDatabase();Cursor cursor = db.query("Book", null, null, null, null, null,null);if (cursor.moveToFirst()) {do {String name = cursor.getString(cursor.getColumnIndex("name"));String author = cursor.getString(cursor.getColumnIndex("author"));int pages = cursor.getInt(cursor.getColumnIndex("pages"));double price = cursor.getDouble(cursor.getColumnIndex("price"));Log.d("MainActivity", "book name is " + name);Log.d("MainActivity", "book author is " + author);Log.d("MainActivity", "book pages is " + pages);Log.d("MainActivity", "book price is " + price);} while (cursor.moveToNext());}cursor.close();}});Button replaceData = (Button) findViewById(R.id.replace_data);replaceData.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {SQLiteDatabase db = dbHelper.getWritableDatabase();db.beginTransaction();try {db.delete("Book", null, null);//if (true) {//throw new NullPointerException();//}ContentValues values = new ContentValues();values.put("name", "Game of Thrones");values.put("author", "George Martin");values.put("pages", 720);values.put("price", 20.85);db.insert("Book", null, values);db.setTransactionSuccessful();} catch (Exception e) {e.printStackTrace();} finally {db.endTransaction();}}});}}

六、总结:

掌握常见数据存储的方法。















0 0
原创粉丝点击