I. 使用 SharedPreferences 来存储应用程序的数据
V. Content Provider 简介
参考:Beginning Android 4 Application Development - Page 252
举例效果:
代码功能:通过"修改文本"按钮可以将文本内容存储, 然后点击"显示文本"按钮就可以显示出刚才修改了的文本.
另外:在其他的 activity 中也可以直接的调用, 调用方法与下面的一样~
1 public class MainActivity extends Activity { 2 3 @Override 4 public void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_main); 7 8 Button displayButton = (Button)findViewById(R.id.button1); 9 displayButton.setOnClickListener(new OnClickListener() { 10 11 public void onClick(View v) { 12 // TODO Auto-generated method stub 13 SharedPreferences appPreferences = getSharedPreferences( 14 "com.example.preferenceexer_preferences", MODE_PRIVATE); 15 Toast.makeText(MainActivity.this, appPreferences.getString("editTextPref", ""), Toast.LENGTH_SHORT).show(); 16 } 17 }); 18 19 Button modifyButton = (Button)findViewById(R.id.button2); 20 modifyButton.setOnClickListener(new OnClickListener() { 21 22 public void onClick(View v) { 23 // TODO Auto-generated method stub 24 SharedPreferences appPreferences = getSharedPreferences( 25 "com.example.preferenceexer_preferences", MODE_PRIVATE); 26 SharedPreferences.Editor prefsEditor = appPreferences.edit(); 27 prefsEditor.putString("editTextPref", ((EditText)findViewById(R.id.editText1)).getText().toString()); 28 prefsEditor.commit(); 29 } 30 }); 31 } 32 }
1. Interface for accessing and modifying preference data returned by getSharedPreferences(String, int).
getSharedPreferences(String, int):返回值:SharedPreferences
第一个参数:就是存储文件的名称, 一般以 <PackageName>_preferences 的格式, 其他应该也是可以的
第二个参数:0 代表 MODE_PRIVATE, 只允许此程序使用. 还有其他的常量.
2. SharedPreferences Methods:
1. 用来修改 SharedPreferences 对象的值。
2. SharedPreferences.Editor Methods:
参考:Beginning Android 4 Application Development - Page 263
效果图:
在 DDMS 视图中找到 File Explore, 选择 data/data/<PackageName>/files/textfile.txt
如下图所示:
public class FilesActivity extends Activity { EditText textBox; static final int READ_BLOCK_SIZE = 100; //字符数组 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textBox = (EditText) findViewById(R.id.txtText1); } public void onClickSave(View view) { String str = textBox.getText().toString(); try { FileOutputStream fOut = openFileOutput("textfile.txt", MODE_WORLD_READABLE); //文件输出流 OutputStreamWriter osw = new OutputStreamWriter(fOut); osw.write(str); osw.close(); Toast.makeText(getBaseContext(), "File saved successfully!", Toast.LENGTH_SHORT).show(); textBox.setText(""); } catch (IOException ioe) { ioe.printStackTrace(); } } public void onClickLoad(View view) { try { FileInputStream fIn = openFileInput("textfile.txt"); //文件写入流 InputStreamReader isr = new InputStreamReader(fIn); char[] inputBuffer = new char[READ_BLOCK_SIZE]; String s = ""; int charRead; while ((charRead = isr.read(inputBuffer))>0) { String readString = String.copyValueOf(inputBuffer, 0, charRead); s += readString; inputBuffer = new char[READ_BLOCK_SIZE]; } textBox.setText(s); Toast.makeText(getBaseContext(), "File loaded successfully!", Toast.LENGTH_SHORT).show(); } catch (IOException ioe) { ioe.printStackTrace(); } } }
源文件下载:Files.zip
参考:Beginning Android 4 Application Development - Page 268
效果图:
在 DDMS 视图中找到 File Explore, 选择 mnt/sdcard/MyFiles/textfile.txt
如下图所示:
public class FilesActivity extends Activity { EditText textBox; static final int READ_BLOCK_SIZE = 100; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); textBox = (EditText) findViewById(R.id.txtText1); } public void onClickSave(View view) { String str = textBox.getText().toString(); try { //---SD Card Storage--- File sdCard = Environment.getExternalStorageDirectory(); File directory = new File (sdCard, "MyFiles"); directory.mkdirs(); File file = new File(directory, "textfile.txt"); FileOutputStream fOut = new FileOutputStream(file); FileWriter fileWriter = new FileWriter(file); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); bufferedWriter.write(str); bufferedWriter.close(); Toast.makeText(getBaseContext(), "File saved successfully!", Toast.LENGTH_SHORT).show(); textBox.setText(""); } catch (IOException ioe) { ioe.printStackTrace(); } } public void onClickLoad(View view) { try { //---SD Storage--- File sdCard = Environment.getExternalStorageDirectory(); File directory = new File (sdCard.getAbsolutePath() + "/MyFiles"); File file = new File(directory, "textfile.txt"); FileInputStream fIn = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fIn); FileReader fileReader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(fileReader); char[] inputBuffer = new char[100]; String strSum = ""; int charRead; while ((charRead = bufferedReader.read(inputBuffer)) > 0) { strSum += new String(inputBuffer); } bufferedReader.close(); textBox.setText(strSum); Toast.makeText(getBaseContext(), "File loaded successfully!", Toast.LENGTH_SHORT).show(); } catch (IOException ioe) { ioe.printStackTrace(); } } }
源文件下载:Files.zip
参考:Beginning Android 4 Application Development - Page 273
※ 参考:Android之SQlite存储
1. 显示了一些用来管理 SQLite 数据的方法。
java.lang.Object
↳ android.database.sqlite.SQLiteClosable
↳ android.database.sqlite.SQLiteDatabase
2. 方法:
1. 数据库查询指针.
若想通过 Cursor 来遍历所有数据, 首先要调用 moveToFirst() 方法, 因为指针不一定知道最上面的位置, 否则会出现数据遗漏, 同时也可以使用 moveToLast() 方法, 然后往上移动~
当调用 moveToFirst() 方法的时候, 显示此时 getPosition() 返回值为 0, 也就是第一条记录;
当调用 moveToLast() 方法的时候, 显示此时 getPosition() 返回值为 7, 也就是最后一条记录.
android.database.Cursor
2. 方法:
1. 用于数据库创建和版本管理的帮助类.
java.lang.Object
↳ android.database.sqlite.SQLiteOpenHelper
2. 方法:
数据库被默认存储在 data/data/<Package_Name>/databases 文件夹内部:
MyDB 中显示的内容如下:
第一步:新建一个 DBAdapter 类, 写入操作数据库的各种方法.
public class DBAdapter { static final String KEY_ROWID = "_id"; static final String KEY_NAME = "name"; static final String KEY_EMAIL = "email"; static final String TAG = "DBAdapter"; static final String DATABASE_NAME = "MyDB"; static final String DATABASE_TABLE = "contacts"; static final int DATABASE_VERSION = 2; static final String DATABASE_CREATE = "create table contacts (_id integer primary key autoincrement, " + "name text not null, email text not null);"; final Context context; DatabaseHelper DBHelper; SQLiteDatabase db; public DBAdapter(Context ctx) { this.context = ctx; DBHelper = new DatabaseHelper(context); } private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); //新建数据库文件 } @Override public void onCreate(SQLiteDatabase db) { try { db.execSQL(DATABASE_CREATE); //创建数据库表 } catch (SQLException e) { e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS contacts"); onCreate(db); } } //---opens the database--- public DBAdapter open() throws SQLException { db = DBHelper.getWritableDatabase(); //为 SQLiteDatabase 赋值. return this; } //---closes the database--- public void close() { DBHelper.close(); } //---insert a contact into the database--- public long insertContact(String name, String email) { ContentValues initialValues = new ContentValues(); initialValues.put(KEY_NAME, name); initialValues.put(KEY_EMAIL, email); return db.insert(DATABASE_TABLE, null, initialValues); } //---deletes a particular contact--- public boolean deleteContact(long rowId) { return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; } //---retrieves all the contacts--- public Cursor getAllContacts() { return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, KEY_EMAIL}, null, null, null, null, null); } //---retrieves a particular contact--- public Cursor getContact(long rowId) throws SQLException { Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, KEY_EMAIL}, KEY_ROWID + "=" + rowId, null, null, null, null, null); if (mCursor != null) { mCursor.moveToFirst(); } return mCursor; } //---updates a contact--- public boolean updateContact(long rowId, String name, String email) { ContentValues args = new ContentValues(); args.put(KEY_NAME, name); args.put(KEY_EMAIL, email); return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; } }
第二步:在 activity 中调用.
public class DatabasesActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); DBAdapter db = new DBAdapter(this);
//下面实现文件从 assets 文件夹中赋值到指定的程序目录中去. try { String destPath = "/data/data/" + getPackageName() + "/databases"; File f = new File(destPath); if (!f.exists()) { f.mkdirs(); f.createNewFile(); //---copy the db from the assets folder into // the databases folder--- CopyDB(getBaseContext().getAssets().open("mydb"), new FileOutputStream(destPath + "/MyDB")); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //---get all contacts--- db.open(); Cursor c = db.getAllContacts(); if (c.moveToFirst()) { do { DisplayContact(c); } while (c.moveToNext()); } db.close(); } public void CopyDB(InputStream inputStream, OutputStream outputStream) throws IOException { //---copy 1K bytes at a time--- byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) > 0) { outputStream.write(buffer, 0, length); } inputStream.close(); outputStream.close(); } public void DisplayContact(Cursor c) { Toast.makeText(this, "id: " + c.getString(0) + "\n" + "Name: " + c.getString(1) + "\n" + "Email: " + c.getString(2), Toast.LENGTH_LONG).show(); } }
源文件下载: Databases.zip
下面展示一些常用操作的实现代码:
INSERT - 插入数据
public long insertContact(String name, String email) { ContentValues initialValues = new ContentValues(); initialValues.put(KEY_NAME, name); initialValues.put(KEY_EMAIL, email); return db.insert(DATABASE_TABLE, null, initialValues); }
//---add a contact--- db.open(); long id = db.insertContact("Wei-Meng Lee", "[email protected]"); id = db.insertContact("Mary Jackson", "[email protected]"); db.close();
SELECT - 选择语句
public Cursor getAllContacts() { return db.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, KEY_EMAIL}, null, null, null, null, null); //null 为返回全部. }
//--get all contacts--- db.open(); Cursor c = db.getAllContacts(); if (c.moveToFirst()) { do { DisplayContact(c); } while (c.moveToNext()); } db.close();
SELECT - 选择语句 & WHERE - 筛选语句
public Cursor getContact(long rowId) throws SQLException { Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, KEY_EMAIL}, KEY_ROWID + "=" + rowId, null, //此处为 where 语句的内容. null, null, null, null); if (mCursor != null) { mCursor.moveToFirst(); } return mCursor; }
//---get a contact--- db.open(); Cursor c = db.getContact(2); if (c.moveToFirst()) DisplayContact(c); else Toast.makeText(this, "No contact found", Toast.LENGTH_LONG).show(); db.close();
UPDATE - 更新语句
public boolean updateContact(long rowId, String name, String email) { ContentValues args = new ContentValues(); args.put(KEY_NAME, name); args.put(KEY_EMAIL, email); return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; }
//---update contact--- db.open(); if (db.updateContact(1, "Wei-Meng Lee", "[email protected]")) Toast.makeText(this, "Update successful.", Toast.LENGTH_LONG).show(); else Toast.makeText(this, "Update failed.", Toast.LENGTH_LONG).show(); db.close();
DELETE - 删除语句
public boolean deleteContact(long rowId) { return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; //null 为删除全部. }
//---delete a contact--- db.open(); if (db.deleteContact(1)) Toast.makeText(this, "Delete successful.", Toast.LENGTH_LONG).show(); else Toast.makeText(this, "Delete failed.", Toast.LENGTH_LONG).show(); db.close();
查询指定名称的个数.
public int queryStudentBySid(String sid) { Cursor cursor = SQLiteDB.query(DATABASE_TABLE_NAME, null, KEY_SID + "=" + sid, null, null, null, null); return cursor.getCount(); }
ORDER BY - 排序语句 (DESC & ASC)
public Cursor ascendStudents() { Cursor cursor = SQLiteDB.query( DATABASE_TABLE_NAME, new String[]{KEY_ID, KEY_SID, KEY_NAME, KEY_GENDER, KEY_HOMETOWN}, null, null, null, null, KEY_SID); if (cursor != null) { cursor.moveToFirst(); } return cursor; }
public Cursor descendStudents() { Cursor cursor = SQLiteDB.query( DATABASE_TABLE_NAME, new String[]{KEY_ID, KEY_SID, KEY_NAME, KEY_GENDER, KEY_HOMETOWN}, null, null, null, null, KEY_SID + " DESC"); //order by 语句内容. if (cursor != null) { cursor.moveToFirst(); } return cursor; }
参考:Beginning Android 4 Application Development - Page 293
1. Content Provider 主要是用来获取其他程序的信息,例如可以取得通讯录中的内容等。
public class McProvider extends ListActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_mc_provider); Uri allContactsUri = Uri.parse("conten://contacts/people"); Cursor cursor; if (android.os.Build.VERSION.SDK_INT < 11) { cursor = managedQuery(allContactsUri, null, null, null, null); } else { CursorLoader cursorLoader = new CursorLoader(this, allContactsUri, null, null, null, null); cursor = cursorLoader.loadInBackground(); } String[] columns = new String[] { ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts._ID}; int[] views = new int[] {R.id.contactName,R.id.contactID}; SimpleCursorAdapter adapter; if (android.os.Build.VERSION.SDK_INT < 11) { adapter = new SimpleCursorAdapter(this, R.layout.activity_mc_provider, cursor, columns, views); } else { adapter = new SimpleCursorAdapter(this, R.layout.activity_mc_provider, cursor, columns, views, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); } this.setListAdapter(adapter); }