数据存储
文件存储、SharedPreferences、数据库存储
- 文件存储
用Java流的方式
public class MainActivity extends AppCompatActivity {
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editText = (EditText) findViewById(R.id.edit);
String inputText = load();
/*此方法是对字符串的双重判断,即不为空,不为null*/
if(!TextUtils.isEmpty(inputText)){
editText.setText(inputText);
// 将光标移动到字符串最后
editText.setSelection(inputText.length());
Toast.makeText(this, "恢复成功", Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
String inputText = editText.getText().toString();
save(inputText);
}
/*文件存储*/
public void save(String inputText) {
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (writer != null) {
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/*文件恢复*/
public String load() {
FileInputStream in = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
in = openFileInput("data");
reader = new BufferedReader(new InputStreamReader(in));
String line = "";
while ((line = reader.readLine()) != null) {
content.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
}
布局设置一个编辑框即可
android studio3.0以上版本已经弃用Android Device Monitor,查看文件可以在View→Tool Windows→Device File Explorer查看
文件目录为/data/data/包名/files/下查看
- SharedPreferences
用键值的方式
public class MainActivity extends AppCompatActivity {
private Button saveData;
private Button restoreData;
private TextView showData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
saveData=(Button)findViewById(R.id.save_data);
restoreData=(Button)findViewById(R.id.restore_data);
showData=(TextView)findViewById(R.id.show_data);
/*存储数据*/
saveData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences.Editor editor=getSharedPreferences("data",MODE_PRIVATE).edit();
editor.putString("name","Tom");
editor.putInt("age",28);
editor.putBoolean("married",false);
editor.apply();
}
});
/*恢复数据*/
restoreData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SharedPreferences pref=getSharedPreferences("data",MODE_PRIVATE);
String name=pref.getString("name","");
int age=pref.getInt("age",0);
boolean married=pref.getBoolean("married",false);
showData.setText("name is "+name+"\n"+"age is "+age+"\n"+"married is "+married);
}
});
}
}
布局就是是两个按钮和一个文本
* 数据库
使用自带数据库SQLITE
布局六个按钮
<Button
android:id="@+id/create_database"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="创建数据库"
/>
<Button
android:id="@+id/add_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加数据"
/>
<Button
android:id="@+id/up_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="更新数据"
/>
<Button
android:id="@+id/delete_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除数据"
/>
<Button
android:id="@+id/query_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查询数据"
/>
新建MyDatabaseHelper类
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK="create table Book ("
+"id integer primary key autoincrement,"
+"author text,"
+"price real,"
+"pages integer,"
+"name text)";
public static final String CREATE_CATEGORY="create table Category ("
+"id integer primary key autoincrement,"
+"category_name text,"
+"category_code integer)";
private Context mContext;
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
mContext=context;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_BOOK);
/*创建新表需要onCreate()方法*/
sqLiteDatabase.execSQL(CREATE_CATEGORY);
//onCreate(sqLiteDatabase);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
修改MainActivity
public class MainActivity extends AppCompatActivity {
public static final String TAG="MainActivity";
private Button createDatabase;
private Button addData;
private Button updateData;
private Button deleteData;
private Button queryData;
private MyDatabaseHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
createDatabase=(Button)findViewById(R.id.create_database);
addData=(Button)findViewById(R.id.add_data);
updateData=(Button)findViewById(R.id.up_date);
deleteData=(Button)findViewById(R.id.delete_data);
queryData=(Button)findViewById(R.id.query_data);
/*添加新表的时候需要更改版本号*/
dbHelper=new MyDatabaseHelper(this,"BookStore.db",null,2);
/*创建数据库*/
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dbHelper.getWritableDatabase();
}
});
/*添加数据*/
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase();
ContentValues values=new ContentValues();
//开始填写第一条数据
values.put("name","离散数学");
values.put("author","屈婉玲");
values.put("pages",300);
values.put("price",33.33);
//插入第一条数据
sqLiteDatabase.insert("Book",null,values);
values.clear();
//开始填写第二条数据
values.put("name","高数十八讲");
values.put("author","张宇");
values.put("pages",400);
values.put("price",44.44);
sqLiteDatabase.insert("Book",null,values);
}
});
/*更新数据*/
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("author","耿素云");
sqLiteDatabase.update("Book",values,"name=?",new String[]{"离散数学"});
}
});
/*删除数据*/
deleteData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase();
sqLiteDatabase.delete("Book","name=?",new String[]{"高数十八讲"});
}
});
/*查询数据*/
queryData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase sqLiteDatabase=dbHelper.getWritableDatabase();
Cursor cursor=sqLiteDatabase.query("Book",null,null,null,null,null,null);
if (cursor.moveToFirst()){
do {
String name=cursor.getString(cursor.getColumnIndex("name"));
String author=cursor.getString(cursor.getColumnIndex("author"));
int pages=cursor.getInt(cursor.getColumnIndex("pages"));
double price=cursor.getDouble(cursor.getColumnIndex("price"));
Log.d(TAG, "book name is "+name);
Log.d(TAG, "book author is "+author);
Log.d(TAG, "book pages is "+pages);
Log.d(TAG, "book price is "+price);
}while (cursor.moveToNext());
}
cursor.close();
}
});
}
}
使用LitePal操作,先去项目主页查看最新版本
implementation 'org.litepal.android:core:2.0.0'
在main下新建assets目录(new→Floder→AssetsFloder),然后在里面新建litepal.xml
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="BookStore">
</dbname>
<version value="1">
</version>
<list>
<mapping class="com.example.litepaltest.Book">
</mapping>
</list>
</litepal>
然后再注册
android:name="org.litepal.LitePalApplication"
1.创建数据库
添加实体类然后映射,再调用LitePal.getDatabase();就是建表
public class Book {
private int id;
private String author;
private double price;
private int pages;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public void setPrice(double price) {
this.price = price;
}
public double getPrice() {
return price;
}
public void setPages(int pages) {
this.pages = pages;
}
public int getPages() {
return pages;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
<list>
<mapping class="com.example.litepaltest.Book">
</mapping>
</list>
public class MainActivity extends AppCompatActivity {
private Button createDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
createDatabase=(Button)findViewById(R.id.create_database);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
LitePal.getDatabase();
}
});
}
}
2升级数据库
在实体类里添加,或者新建实体类,然后在litepal.xml中更改版本号后映射即可
public class Category {
private int id;
private String categoryName;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCategoryName() {
return categoryName;
}
public void setCategoryName(String categoryName) {
this.categoryName = categoryName;
}
}
<version value="2">
</version>
<list>
<mapping class="com.example.litepaltest.Book">
</mapping>
<mapping class="com.example.litepaltest.Category">
</mapping>
</list>
3.向LitePal添加数据(增)
只是创建数据库是不需要继承结构的,而进行CRUD(增删改查)操作,实体类是需要继承LitePalSupport的
添加数据只需要调用实体类的set方法和DataSupport的save()方法即可
public class Book extends LitePalSupport
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book=new Book();
book.setName("离散数学");
book.setAuthor("屈婉玲");
book.setPages(400);
book.setPrice(40.35);
book.setPress("清华大学出版社");
book.save();
}
});
4.更新数据
updataData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Book book = new Book();
book.setAuthor("耿素云");
book.updateAll("author=?","屈婉玲");
}
});
5.删除数据
LitePal.deleteAll(Book.class,"price<?","15");
6.查询数据
List<Book>books=LitePal.findAll(Book.class);
for(Book book:books){
Log.d("MainActivity","book name is "+book.getName());
Log.d("MainActivity","book author is "+book.getAuthor());
Log.d("MainActivity","book pages is "+book.getPages());
Log.d("MainActivity","book price is "+book.getPrice());
Log.d("MainActivity","book press is "+book.getPress());