Android的内部存储数据指的是存储于该APP包内的数据,内部存储数据则指的是存储在SD卡中的数据,现在大多数手机都已经无外置SD卡,因此这里指内置的SD卡。
SharePreference是一个轻量级的配置信息存储文件,即XML,主要存储应用的配置信息;PreferenceActivity则是将配置选项可视化,把配置信息存储在Activity中。
SQLite是Android使用的一款轻型的数据库,该数据库的设计目标是嵌入式。
读写内外部存储数据
首先增加3个EditText来键入要存储的数据和6个Button来分别写入、读取内外部存储数据、打开PreferenceActivity,增加数据到SQLITE. 如下图
定义文件名
private static final String FILE_NAME = "this is a demo file";
写内部存储数据
case R.id.bt_writeInternalData:
try {
FileOutputStream fileOutputStream = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8");
outputStreamWriter.write(et_data.getText().toString());
outputStreamWriter.close();
fileOutputStream.close();
Toast.makeText(this, "写入内部存储成功", Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
读内部存储数据
case R.id.bt_readInternalData:
try {
FileInputStream fileInputStream = openFileInput(FILE_NAME);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "utf-8");
char[] chars = new char[fileInputStream.available()];
inputStreamReader.read(chars);
inputStreamReader.close();
fileInputStream.close();
String string = new String(chars);
tv_showdata.setText(string);
Toast.makeText(this, "读取内部存储成功", Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
读写内外部存储数据
在读写外部数据时,我们需要获取外部存储的路径Dir
File sdcardDir = Environment.getExternalStorageDirectory();
并在manifest中增加读写外部存储数据的许可
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
case R.id.bt_writeExternalData:
File file = new File(sdcardDir, FILE_NAME);
if (!file.exists()) {
Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
} else {
try {
Toast.makeText(this, "当前系统具备SD卡目录", Toast.LENGTH_SHORT).show();
file.createNewFile();
FileOutputStream fileOutputStream = new FileOutputStream(file);
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "UTF-8");
outputStreamWriter.write(et_data.getText().toString());
outputStreamWriter.flush();
outputStreamWriter.close();
fileOutputStream.close();
Toast.makeText(this, "写入外部存储成功", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
break;
读外部存储数据
case R.id.bt_readExternalData:
file = new File(sdcardDir, FILE_NAME);
if (file.exists()) {
try {
FileInputStream fileInputStream = new FileInputStream(file);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "utf-8");
char[] chars = new char[fileInputStream.available()];
inputStreamReader.read(chars);
inputStreamReader.close();
fileInputStream.close();
String string = new String(chars);
tv_showdata.setText(string);
Toast.makeText(this, "读取外部存储成功", Toast.LENGTH_SHORT).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
break;
PreferenceActivity
再增加一个按钮来启动PreferenceActivity
case R.id.bt_perferenActivity:
startActivity(new Intent(this,MyPreferenceActivity.class));
break;
创建一个新的Activity并继承于PreferenceActivity,并在ONCREATE中绑定
R.xml.mypreference,它是一个XML文件,用于配置preference。
public class MyPreferenceActivity extends PreferenceActivity {
private PreferenceManager preferenceManager;
private CheckBoxPreference checkBoxPreference;
private ListPreference listPreference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.mypreference);
preferenceManager=getPreferenceManager();
checkBoxPreference= (CheckBoxPreference) preferenceManager.findPreference("checkbox");
Toast.makeText(getApplicationContext(),"当前状态是:"+checkBoxPreference.isChecked(),Toast.LENGTH_SHORT).show();
listPreference= (ListPreference) preferenceManager.findPreference("list");
Toast.makeText(getApplicationContext(),listPreference.getEntry()+"当前环境是:"+listPreference.getValue(),Toast.LENGTH_SHORT).show();
}
}
R.xml.mypreference
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:key="checkbox"
android:title="是否开启"
android:summaryOn="已经开启"
android:summaryOff="已经关闭"></CheckBoxPreference>
<ListPreference
android:key="list"
android:title="请选择一个选项"
android:summary="请点击选择"
android:entries="@array/entries"
android:entryValues="@array/values"></ListPreference>
<EditTextPreference
android:key="edit"
android:title="请输入内容"
android:summary="请点击输入"></EditTextPreference>
<RingtonePreference
android:key="ringtone"
android:title="ringtone"
android:summary="请选择"></RingtonePreference>
<SwitchPreference
android:key="switch"
android:title="是否选定"
android:summary="请点击右侧switch"
android:background="@android:color/holo_green_dark"
></SwitchPreference>
<MultiSelectListPreference
android:key="muliti"
android:title="MultiSelectListPreference"
android:entries="@array/entries"
android:entryValues="@array/values"
></MultiSelectListPreference>
</PreferenceScreen>
SQLite
创建一个类来继承SQLiteOpenHelper,重写方法ONCREATE
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE user(" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT,"+
"name TEXT DEFAULT \"\"," +
"age TEXT DEFAULT \"\")");
}
让MainActivity继承ListActivity,并在布局文件中增加一个Listview,设置其ID为android:id="@android:id/list",
再增加两个EDITTEXT用于输入数据的NAME和AGE,一个增加相应按钮。
getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener()该方法定义了ITEM选项在长按情况下可以将该项数据从SQLite数据库中删除,并弹出确认窗口。
database = new Database(this, "DB_demo", null, 1);
dbwriter = database.getWritableDatabase();
dbreader = database.getReadableDatabase();
simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.database_layout, null, new String[]{"name", "age"}, new int[]{R.id.tv_name, R.id.tv_age});
setListAdapter(simpleCursorAdapter);
refreshListview();
getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) {
new AlertDialog.Builder(MainActivity.this).setTitle("提示").setMessage("确定要删除该项吗?").setNegativeButton("取消", null).setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Cursor cursor = simpleCursorAdapter.getCursor();
cursor.moveToPosition(position);
int itemId = cursor.getInt(cursor.getColumnIndex("_id"));
dbwriter.delete("user", "_id=?", new String[]{itemId + ""});
refreshListview();
}
}).show();
return true;
}
});
private void refreshListview() { Cursor cursor = dbreader.query("user", null, null, null, null, null, null); simpleCursorAdapter.changeCursor(cursor); }
case R.id.bt_insertsqldata:
if (!et_name.getText().toString().equals("") && !et_age.getText().toString().equals("")) {
ContentValues contentValues = new ContentValues();
contentValues.put("name", et_name.getText().toString());
contentValues.put("age", et_age.getText().toString());
dbwriter.insert("user", null, contentValues);
refreshListview();
}
break;