文章目錄
實例一 實例二
實例三
實例四
SharedPredferences與Editor簡介
SharedPreferences本身是一個接口,無法直接創建,只能通過getSharedPreferences(String name,int mode)方法獲取。
提供如下常用方法:
- boolean contains(String key):
- abstract Map<String , ? >getAll():
- boolean getXxx(String key,xxx defValue):其中xxx可以是boolean,float,int ,long ,String.
- SharedPreferences.Editor clear():
- SharedPreference.Editor putXxx();
- SharedPreference.Editor remove(String key);
- boolean commit();
使用方法:
- SharedPreferences preferences = getSharedPreferences(“aserbao”,MODE_PRIVATE);
- SharedPreferences.Editor edit = preferences.edit();
獲取數據代碼;
String time = preferences.getString("time", null);
// 讀取int類型的數據
int randNum = preferences.getInt("random", 0);
存儲數據代碼:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 "+ "hh:mm:ss");
// 存入當前時間
editor.putString("time", sdf.format(new Date()));
// 存入一個隨機數
editor.putInt("random", (int) (Math.random() * 100));
// 提交所有存入的數據
editor.commit();
File存儲
實例一代碼:
public class MainActivity extends Activity
{
final String FILE_NAME = "crazyit.bin";
@Override
public 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()
{
@Override
public void onClick(View source)
{
// 將edit1中的內容寫入文件中
write(edit1.getText().toString());
edit1.setText("");
}
});
read.setOnClickListener(new OnClickListener()
{
@Override
public 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包裝成PrintStream
PrintStream ps = new PrintStream(fos);
// 輸出文件內容
ps.println(content);
// 關閉文件輸出流
ps.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
讀取SD卡上的文件
讀取SD卡文件的步驟
- 調用Enviroment的getExternalStorageState()方法判斷手機是否插入SD卡,並且應用程序具有讀寫SD卡的權限
- 調用Enviroment的getExternalStorageDirectory()方法來獲取外部存儲器,也就是SD卡目錄
- 使用FileInputStream,FileOutputStream,FileReader或FileWriter讀寫SD卡里的文件。
如果不想使用Enviroment的getExternalStorageState()方法,完全可以使用/mnt/sdcard/路徑代表SD卡的路徑,然後通過判斷/mnt/sdcard/路徑是否存在就知道手機是否插入SD卡。
權限:
<!-- 在SD卡中創建與刪除文件權限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 向SD卡寫入數據權限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
實例二代碼
public class MainActivity extends Activity
{
final String FILE_NAME = "/crazyit.bin";
@Override
public 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()
{
@Override
public void onClick(View source)
{
// 將edit1中的內容寫入文件中
write(edit1.getText().toString());
edit1.setText("");
}
});
read.setOnClickListener(new OnClickListener()
{
@Override
public 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();
System.out.println("----------------" + sdCardDir);
// 獲取指定文件對應的輸入流
FileInputStream fis = new FileInputStream(
sdCardDir.getCanonicalPath() + FILE_NAME);
// 將指定輸入流包裝成BufferedReader
BufferedReader 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());
// 關閉RandomAccessFile
raf.close();
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
SQLite數據庫
使用SQLiteDatabase進行數據庫操作步驟如下:
- 獲取SQLiteDatabase對象,它代表與數據庫的連接
- 調用SQLiteDatabase的方法來執行SQL語句
- 調用SQL語句執行結果,比如用SimpleCursorAdapter封裝Cursor.
- 關閉SQLiteDatabase,回收資源
創建數據庫和表
db = SQLiteDatabase.openOrCreateDatabase(
this.getFilesDir().toString()
+ "/my.db3", null);
上面代碼返回一個SQLiteDatabase對象,該對象的execSQL()可執行任意的SQL語句,可通過如下代碼在應用程序中創建表:
db.execSQL("create table news_inf(_id integer"
+ " primary key autoincrement,"+ " news_title varchar(50),"+ " news_content varchar(255))");
實例三代碼:
public class MainActivity extends Activity
{
SQLiteDatabase db;
Button bn = null;
ListView listView;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 創建或打開數據庫(此處需要使用絕對路徑)
db = SQLiteDatabase.openOrCreateDatabase(
this.getFilesDir().toString()
+ "/my.db3", null); // ①
listView = (ListView) findViewById(R.id.show);
bn = (Button) findViewById(R.id.ok);
bn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
// 獲取用戶輸入
String title = ((EditText) findViewById(
R.id.title)).getText().toString();
String content = ((EditText) findViewById(R.id.content))
.getText().toString();
try
{
insertData(db, title, content);
Cursor cursor = db.rawQuery("select * from news_inf"
, null);
inflateList(cursor);
}
catch (SQLiteException se)
{
// 執行DDL創建數據表
db.execSQL("create table news_inf(_id integer"
+ " primary key autoincrement,"
+ " news_title varchar(50),"
+ " news_content varchar(255))");
// 執行insert語句插入數據
insertData(db, title, content);
// 執行查詢
Cursor cursor = db.rawQuery("select * from news_inf"
, null);
inflateList(cursor);
}
}
});
}
private void insertData(SQLiteDatabase db
, String title, String content) // ②
{
// 執行插入語句
db.execSQL("insert into news_inf values(null , ? , ?)"
, new String[] {title, content });
}
private void inflateList(Cursor cursor)
{
// 填充SimpleCursorAdapter
SimpleCursorAdapter adapter = new SimpleCursorAdapter(
MainActivity.this,
R.layout.line, cursor,
new String[] { "news_title", "news_content" }
, new int[] {R.id.my_title, R.id.my_content },
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); // ③
// 顯示數據
listView.setAdapter(adapter);
}
@Override
public void onDestroy()
{
super.onDestroy();
// 退出程序時關閉SQLiteDatabase
if (db != null && db.isOpen())
{
db.close();
}
}
}
使用sqlite工具
sqlite在Android SDK的platform-tools目錄下
常用命令如下:
- .databases:查看當前數據庫
- .tables:查看當前數據庫中的數據表
- .help:幫助命令
使用特定的方法操作SQLite數據庫
使用insert方法插入記錄
SQLiteDatabase的insert方法的簽名爲long insert(String table, String nullColumnHack,ContentValues values),參數說明如下:
- table:數據表名
- nullColumnHack:代表強行插入null值的數據列的表名。當values參數爲null或不包含key_value對時該參數有效。
- values:代表一行記錄的數據。
insert方法插入的一行記錄使用ContentValues存放。
ContentValues values = new ContentValues();
values.put("name","aserbao");
values.put("age",25);
db.insert("表名",null,values);
生成的SQL語句如下:
insert into <表名>(key1,key2…)values(value1,value2…)
使用update方法更新記錄
update(String table,ContentValues values,String whereClause,String[] whereArgs);參數說明如下:
- table:表名
- valuse:想更新的數據
- whereClause:代表滿足whereClause字句的記錄將會被更新
- whereArgs: 用於whereClause子句傳入參數。
ContentValues values = new ContentValues();
values.put("name","imerbao");
int result = db.update("表名",values,"_id>?",new Integer[]{20})
生成的SQL語句如下:
update <table>set key1=value1,key2=value2…… where <whereCluse>
使用Delete方法刪除記錄
delete(String table,String whereClause,String[] whereArgs)參數說明同上
刪除以a開頭的人名:
db.delete("表名","person_name like ?",new String[]{"a_"});
對應的SQL語句如下:
delete <table>where <whereClause>
使用query查詢記錄
Cursor query(boolean distinct,String table,String[] columns,String whereClause,String[] selectionArgs,String groupBy,String having,String orderBy);
distinct:是否去重;
table:表名
columns:需要查出來的列名
whereClause:條件子句
selectionArgs:用於在whereClause子句的佔位符傳入參數值,值在數組中的位置與佔位符在語句中的位置必須一致,否則就會有異常。
groupBy:用於控制分組
having:用於對分組進行過濾
orderBy:用於對記錄進行排序
limit:用於進行分頁
如果想查出表中以i開頭的記錄,語句如下:
db.query("表名",new String[]{"_id,name,age"}),"name like ?", new String[]{"i%"},null,null,"
SQLiteOpenHelper類
方法:
- synchronized SQLiteDatabase getReadableDatabase():
- synchronized SQLiteDatabase getWritableDataable();
- abstract void onCreate(SQLiteDatabase db);
- abstract void onUpdate(SQLiteDatabase db,int oldVersion, int newVersion);
- synchronized void close();
實例四MainActivity代碼:
public class MainActivity extends Activity
{
MyDatabaseHelper dbHelper;
Button insert = null;
Button search = null;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 創建MyDatabaseHelper對象,指定數據庫版本爲1,此處使用相對路徑即可
// 數據庫文件自動會保存在程序的數據文件夾的databases目錄下
dbHelper = new MyDatabaseHelper(this, "myDict.db3", 1);
insert = (Button) findViewById(R.id.insert);
search = (Button) findViewById(R.id.search);
insert.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
// 獲取用戶輸入
String word = ((EditText) findViewById(R.id.word))
.getText().toString();
String detail = ((EditText) findViewById(R.id.detail))
.getText().toString();
// 插入生詞記錄
insertData(dbHelper.getReadableDatabase(), word, detail);
// 顯示提示信息
Toast.makeText(MainActivity.this, "添加生詞成功!"
, Toast.LENGTH_LONG).show();
}
});
search.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View source)
{
// 獲取用戶輸入
String key = ((EditText) findViewById(R.id.key)).getText()
.toString();
// 執行查詢
Cursor cursor = dbHelper.getReadableDatabase().rawQuery(
"select * from dict where word like ? or detail like ?",
new String[] { "%" + key + "%", "%" + key + "%" });
// 創建一個Bundle對象
Bundle data = new Bundle();
data.putSerializable("data", converCursorToList(cursor));
// 創建一個Intent
Intent intent = new Intent(MainActivity.this
, ResultActivity.class);
intent.putExtras(data);
// 啓動Activity
startActivity(intent);
}
});
}
protected ArrayList<Map<String, String>>
converCursorToList(Cursor cursor)
{
ArrayList<Map<String, String>> result =
new ArrayList<Map<String, String>>();
// 遍歷Cursor結果集
while (cursor.moveToNext())
{
// 將結果集中的數據存入ArrayList中
Map<String, String> map = new HashMap<>();
// 取出查詢記錄中第2列、第3列的值
map.put("word", cursor.getString(1));
map.put("detail", cursor.getString(2));
result.add(map);
}
return result;
}
private void insertData(SQLiteDatabase db, String word
, String detail)
{
// 執行插入語句
db.execSQL("insert into dict values(null , ? , ?)"
, new String[] {word, detail });
}
@Override
public void onDestroy()
{
super.onDestroy();
// 退出程序時關閉MyDatabaseHelper裏的SQLiteDatabase
if (dbHelper != null)
{
dbHelper.close();
}
}
}
MyDatabaseHelper代碼:
public class MyDatabaseHelper extends SQLiteOpenHelper
{
final String CREATE_TABLE_SQL =
"create table dict(_id integer primary " +
"key autoincrement , word , detail)";
public MyDatabaseHelper(Context context, String name, int version)
{
super(context, name, null, version);
}
@Override
public void onCreate(SQLiteDatabase db)
{
// 第一次使用數據庫時自動建表
db.execSQL(CREATE_TABLE_SQL);
}
@Override
public void onUpgrade(SQLiteDatabase db
, int oldVersion, int newVersion)
{
System.out.println("--------onUpdate Called--------"
+ oldVersion + "--->" + newVersion);
}
}
ResultActivity代碼:
public class ResultActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.popup);
ListView listView = (ListView) findViewById(R.id.show);
Intent intent = getIntent();
// 獲取該intent所攜帶的數據
Bundle data = intent.getExtras();
// 從Bundle數據包中取出數據
@SuppressWarnings("unchecked")
List<Map<String, String>> list = (List<Map<String, String>>)
data.getSerializable("data");
// 將List封裝成SimpleAdapter
SimpleAdapter adapter = new SimpleAdapter(ResultActivity.this
, list,
R.layout.line, new String[] { "word", "detail" }
, new int[] {R.id.word, R.id.detail });
// 填充ListView
listView.setAdapter(adapter);
}
}
自述:
再過兩天就要回湖南老家了,2016感覺怎麼都沒做就結束了,2年多沒見爸媽了,這次得回家好好和家人聚聚。基礎到位,2017,走上大神之路。