一、以文件(File)的方式存储
1、存储到手机内存
(1)通过FileOutputStream类来实现
File file = new File("/data/data/com.example.test/123.txt");
try {
fos = new FileOutputStream(file);
fos.write("hello world".getBytes());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(fos != null)
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
注意,这种方式保存文件,其保存路径必须为/data/data/包名/ 目录下
此外,只有当new FileOutputStream()执行完才会在上面的路径下生成123.txt文件,new File()执行完是不会直接生成实际的文件的。
(2)通过Context的openFileOutput来实现
FileOutputStream fos = null;
try {
fos = openFileOutput("123.txt", Activity.MODE_PRIVATE);
fos.write("hello world".getBytes());
Toast.makeText(MainActivity.this, "保存成功", 3000).show();
} catch (Exception e) {
e.printStackTrace();
}finally{
if(fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
这种方式保存文件相对简单,不需要显式指明路径。
文件自动会保存到/data/data/包名/files/ 目录下
2、以文件的方式存储到SD卡
//判断SD卡是否已经挂载
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File file = Environment.getExternalStorageDirectory(); //获得SD卡的路径
File f = new File(file,"123.txt");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(f);
fos.write("hello world".getBytes());
fos.close();
Toast.makeText(MainActivity.this, "保存成功", 3000).show();
} catch (Exception e) {
e.printStackTrace();
}
}else{
Toast.makeText(MainActivity.this, "SD卡不存在", 3000).show();
}
二、以SharePreference的方式存储
开发中,用得比较多的一种存储方式,适合于存储小量的数据。比如记住登陆账号,选择状态等等。。
存储数据代码:
/通过Context的getSP方法获得SharedPreferences对象
//参数一:文件名 参数二:保存属性,这里设置为私有
SharedPreferences sp = getSharedPreferences("config", Activity.MODE_PRIVATE);
//要想往config里写入数据,必须先获得编辑器,获得编辑器的方法如下:
Editor editor = sp.edit();
editor.putString("user", "zhang");
editor.putString("password", "123456");
editor.commit(); //数据必须提交才能成功保存
Toast.makeText(MainActivity.this, "保存成功", 3000).show();
获取数据代码:
SharedPreferences sp = getSharedPreferences("config", Activity.MODE_PRIVATE);
String getUser = sp.getString("user", "none");
String getPw = sp.getString("password", "none");
1、定义一个类,继承于SQLiteOpenHelper
重写onCreate和onUpgrade方法,并且增加一个构造方法,该构造方式显式调用父类四个参数的构造方法。
public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context,String name,int version){
super(context, name, null, version);
}
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table person(id Integer primary key autoincrement," +
"name varchar(20),age varchar(20))");
}
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
System.out.println("update");
db.execSQL("alter table person add money varchar(20)");
}
}
构造方法四个参数的含义:参数一,上下文。参数二,数据库的名字。参数三,CursorFactory,一般为null。
参数四,数据库的版本。
onCreate方法会在当该名字的数据库不存在的时候,调用getReadableDatabase或者getWritableDatabase方法时
执行。其中SQL语句如上代码所示,创建一张person表,id是整形并且是自增长的,name和age是普通类型
onUpgrade方法会在数据库版本号往上递增的时候回调。上面的SQL语句的含义是,在person表中增加一栏money。
2、增删改查操作
创建数据库:
private class CreateListener implements OnClickListener{
public void onClick(View v) {
MyOpenHelper helper = new MyOpenHelper(MainActivity.this,
"sqltext", 1);
SQLiteDatabase sql = helper.getReadableDatabase();
}
}
第一次执行上述语句,会创建一个名字为sqltext的数据库。
更新数据库:
private class UpdateListener implements OnClickListener{
public void onClick(View v) {
MyOpenHelper helper = new MyOpenHelper(MainActivity.this,
"sqltext", 2);
SQLiteDatabase sql = helper.getReadableDatabase();
}
}
版本号由1升为2的时候,会更新数据库,调用onUpgrade方法。
增加数据:
通过ContentValues类往数据库增加15条数据
private class InsertListener implements OnClickListener{
public void onClick(View v) {
MyOpenHelper helper = new MyOpenHelper(MainActivity.this,
"sqltext", 2);
SQLiteDatabase sql = helper.getWritableDatabase();
ContentValues values = new ContentValues();
for(int i=0; i<15; i++){
values.put("name", "test"+i);
values.put("age", 20+i+"");
values.put("money", 8100+i*10+"");
sql.insert("person", null, values);
}
}
}
private class DeleteListener implements OnClickListener{
public void onClick(View v) {
MyOpenHelper helper = new MyOpenHelper(MainActivity.this,
"sqltext", 2);
SQLiteDatabase sql = helper.getWritableDatabase();
sql.delete("person", "name=?", new String[]{"duncan"});
}
}
删除person表里,name="duncan"的行
修改数据:
private class DataListener implements OnClickListener{
public void onClick(View v) {
MyOpenHelper helper = new MyOpenHelper(MainActivity.this,
"sqltext", 2);
SQLiteDatabase sql = helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("money", "8800");
sql.update("person", values, "name=?", new String[]{"test5"});
}
}
修改person表里,name="test5"的那一行里的money,把它改为8800
查询数据:
private class QueryListener implements OnClickListener{
public void onClick(View v) {
MyOpenHelper helper = new MyOpenHelper(MainActivity.this,
"sqltext", 2);
SQLiteDatabase sql = helper.getReadableDatabase();
Cursor cursor = sql.query("person", new String[]{"name","age"}, "name=?", new String[]{"test1"}, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(0);
String age = cursor.getString(1);
System.out.println("--->" + name+"...."+age);
}
}
}
sql.query的结果是把name="test1"的行里的name和age这两列,返回Cursor对象,通过该游标就可以遍历其里面的数据了。