Android數據存儲與IO


這裏寫圖片描述 實例一這裏寫圖片描述 實例二
這裏寫圖片描述 實例三
這裏寫圖片描述 實例四

SharedPredferences與Editor簡介

SharedPreferences本身是一個接口,無法直接創建,只能通過getSharedPreferences(String name,int mode)方法獲取。

提供如下常用方法:

  1. boolean contains(String key):
  2. abstract Map<String , ? >getAll():
  3. boolean getXxx(String key,xxx defValue):其中xxx可以是boolean,float,int ,long ,String.
  4. SharedPreferences.Editor clear():
  5. SharedPreference.Editor putXxx();
  6. SharedPreference.Editor remove(String key);
  7. boolean commit();

使用方法:

  1. SharedPreferences preferences = getSharedPreferences(“aserbao”,MODE_PRIVATE);
  2. 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卡文件的步驟

  1. 調用Enviroment的getExternalStorageState()方法判斷手機是否插入SD卡,並且應用程序具有讀寫SD卡的權限
  2. 調用Enviroment的getExternalStorageDirectory()方法來獲取外部存儲器,也就是SD卡目錄
  3. 使用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進行數據庫操作步驟如下:

  1. 獲取SQLiteDatabase對象,它代表與數據庫的連接
  2. 調用SQLiteDatabase的方法來執行SQL語句
  3. 調用SQL語句執行結果,比如用SimpleCursorAdapter封裝Cursor.
  4. 關閉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目錄下
常用命令如下:

  1. .databases:查看當前數據庫
  2. .tables:查看當前數據庫中的數據表
  3. .help:幫助命令

使用特定的方法操作SQLite數據庫

使用insert方法插入記錄

SQLiteDatabase的insert方法的簽名爲long insert(String table, String nullColumnHack,ContentValues values),參數說明如下:

  1. table:數據表名
  2. nullColumnHack:代表強行插入null值的數據列的表名。當values參數爲null或不包含key_value對時該參數有效。
  3. 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);參數說明如下:

  1. table:表名
  2. valuse:想更新的數據
  3. whereClause:代表滿足whereClause字句的記錄將會被更新
  4. whereArgs: 用於whereClause子句傳入參數。
ContentValues values = new ContentValues();
values.put("name","imerbao");
int result = db.update("表名",values,"_id>?",new Integer[]{20})

生成的SQL語句如下:

update &lt;table>set key1=value1,key2=value2…… where &lt;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類

方法:

  1. synchronized SQLiteDatabase getReadableDatabase():
  2. synchronized SQLiteDatabase getWritableDataable();
  3. abstract void onCreate(SQLiteDatabase db);
  4. abstract void onUpdate(SQLiteDatabase db,int oldVersion, int newVersion);
  5. 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,走上大神之路。

發佈了50 篇原創文章 · 獲贊 169 · 訪問量 52萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章