android学习之 数据存储全方案
Posted 诶就是玩儿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android学习之 数据存储全方案相关的知识,希望对你有一定的参考价值。
这里写目录标题
文件
文件存储
- 不对文件进行任何格式化处理,适合简单或二进制文件
- openFileInput()
以文件名作为唯一参数,自动到data/data//file目录下加载文件,得到FileInputStream对象,通过java流读出来
文件保存
public void save(){
//初始化
String data="Data to Save"
FileOutputStream fos=null;
BufferWriter bw=null;
try{
//转对象,写进
fos=openFileOutput("data",Context.MODE_PRIVTAE);//(文件名,模式)
bw=new BufferWriter(new OutputStreamWriter(fos));
//处理异常
}catch(IOException e){
e.printStackTrace();
}finally{
try{
if(bw!=null){
bw.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
- 应用(将EditText框里的内容保存)
public class MainActivity extends AppCompatActivity {
EditText edit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
edit=(EditText)findViewById(R.id.edit);
}
protected void onDestory(){
//重写onDestory(),保证在活动销毁之前会调用
//重写不仅继承父类功能,还加上自己的行为save()
super.onDestroy();
String inputText=edit.getText().toString();
save(inputText); //调用save方法
}
}
文件读入
//用openFileInput()获取FileInputStream,构建InputStreamReader,再BufferedReader
public String load(){
//初始化
FileInputStream fi=null;
BufferReader br=null;
StringBuilder content=new StringBuilder();
try{
//转对象
in=openFileInput("data");
br=new BufferedReader(new InputStramReader(in));
//拿到
String line="";
while((line==br.readLine())!=null){
content.append(line);
}
//处理异常
}catch(IOException e){
e.printStackTrace();
}
return content.toString();
}
- 查看存储:android Device Monitor ->File Explorer
SharedPreferences
得到对象的三种方式
-
Context. getSharedPreferences(文件名,MODE_PRIVATE)
-
Activity . getPreferences(MODE_PRIVATE)
- 以
类
作为前缀名
- 以
-
PreferenceManger . getDefaultSharedPreferences()
- 静态方法,以
包
作为前缀名,接受Context参数
- 静态方法,以
存储数据
- edit()编辑,apply()提交
- putXxx 向SharedPreferences.Editor对象中添加数据,
//MainActivity
protected void onCreate..
...
Button savaData=(Button)findViewById(R.id.save_data);
saveData.setOnClickListener(new View.OnClickListener){
public void onClick(View v){
SharePreferences.Editor editor=getSharePreferences("data",MODE_PRIVATE).edit();
editor.putString("name","Tom");
editor.putInt("age",28);
editor.putBoolean("married",true);
editor.apply();
}
}
读取数据
- 每一个put方法都对应一个get方法
- 储存键值对,通过得到键,得到值
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
...
Button restore=(Button)findViewById(R.id.resore);
View.OnClickListener(new View.OnClickListener(){
public void onClick(View v){
SharedPreferences pref=getPreferences("data",MODE_PRIVATE);
String name= pref.getString("name","");
int age= pref.getInt("age",0);
boolean married=pref.getBoolean("married",true);
Log.d("MainActivity",name);
Log.d("MainActivity","age is"+age);
Log.d("MainActivity","married is"+married);
});
}
CheckBox控件
记住密码功能
//LoginActivity
public class LoginActivity extends AppCompatActivity {
//初始化
private SharedPreferences pref;
private SharedPreferences.Editor editor;
private EditText accountEdit;
private EditText passwordEdit;
private Button login;
private CheckBox rememberPass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login2);
pref= PreferenceManager.getDefaultSharedPreferences(this); //获取对象
accountEdit=(EditText)findViewById(R.id.account);
passwordEdit=(EditText)findViewById(R.id.password);//获取密码,账号实例
rememberPass=(CheckBox)findViewById(R.id.remember_pass);
login=(Button)findViewById(R.id.login);
boolean isRemember=pref.getBoolean("remember_password",false);
//把账号密码都设置到文本框中
if(isRemember){
//账号密码初始化
String account=pref.getString("account","");
String password=pref.getString("password","");
accountEdit.setText(account);
passwordEdit.setText(password);
rememberPass.setChecked(true);
}
login.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
String account = accountEdit.getText().toString(); //getText() toString()功能
String password = passwordEdit.getText().toString();
if (account.equals("Alice") && password.equals("12345678")) {
editor=pref.edit();
if(rememberPass.isChecked()){ //检查复选框是否被选中
editor.putBoolean("remember_password",true); //储存下来
editor.putString("account",account);
editor.putString("password",password);
}else{
editor.clear(); //没有被选中,SharedPreferences中数据清除
}
editor.apply();//提交
Intent intent = new Intent(LoginActivity.this, MainActivity.class);//Intent,登录成功,就跳转到MainActivity
startActivity(intent);
finish();
} else {
Toast.makeText(LoginActivity.this, "account or password is invalid", Toast.LENGTH_SHORT).show();
}
}
});
}
}
SQLite数据库存储
- 特点
速度快,占用资源少,适合在移动设备上使用
可无需用户密码账户,支持标准SQL,ACID事务 - getReadableDatabase() ,
getWritableDatabase()有创建或打开现有数据库功能,磁盘已满时,只能用只读的方式打开数据库
创建升级
- 创建帮助类,重写 onUpgrade() onCreate()
//MyDataBaseHelper类
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK="create table Book("
+"id integer primary key autoincrement,"//将id设为主键,用autoincrement实现id列自增长
+"author text," //text文本类型
+"price real," //real浮点型
+"pages integer" //integer整型
+"name text)"; //blob二进制型
public static final String CREATE_CATEGORY="create table category("+
"id integer primary key autoincrement,"
+"name text,"
+"code integer)";
private Context myContext;
//四个参数:上下文,数据库名,(查询数据时返回自定义Cursor)null,版本号
public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,int version){
super(context,name,factory,version);
myContext=context;
}
public void onCreate(SQLiteDatabase db){
db.execSQL(CREATE_BOOK); //execSQL执行建表语句
db.execSQL(CREATE_CATEGORY);
Toast.makeText(myContext,"Create Successful~!",Toast.LENGTH_SHORT).show();
}
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
db.execSQL("drop table if exists Book");
db.execSQL("drop table if exists Category");//DROP语句,如果存在,就先删掉
onCreate(db);
}
}
添加数据
//MainActivity
protected void onCreate...
...
//dbHelper=new MyDatabaseHelper(this,"BookSore.db",null,2);//创建时
dbHelper=new MyDatabaseHelper(this,"BookStore.db",null,2);//比创建是数据库版本号高即可运行更新流程
//MainActivity
protected void onCreate...
...
Button addData=(Button)findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
//获取SQL对象
SQLiteDatabase db=dbHelper.getWritableDatabase();
//使用ContentValues对要添加的数据进行组装
ContentValues values=new ContentValues();
values.put("name","Micheal");
value.put("page",455);
db.insert("Book",null,values);//添加语句
values.clear();
//前面创建表时,将id列设为自增长,无需再手动赋值
//输入SQL查询语句--select*from Book
}
更新数据
db.update("Book",values,"name=?",new String[]{"Karl"});
删除数据
public void onClick(View v){
SQLiteDatabase db=dbHelper.getWritableDatabase();
db.detele("Book","page>?",new String[]{"500"});
}
查询数据
public void onClick(View v){
SQLiteDatabase db=dbHelper.getWritableDatabase();
//查询Book表中所有数据
Cursor cursor=db.query("Book",null,null,null,null,null,null);
if(cursor.moveToFirst()){
do{
//遍历Cursor对象,取出数据并打印
String name=cursor.getName(cursor.getColumnIndex("name"));
Int age=cursor.getName(cursor.getColumnIndex("age"));
Lod.d("MainActivity","book name"+name);
}while(cursor.moveToNext());
}
cursor.close();
}
- 除查询数据调用的是rawQuery()方法,其他操作都是execSQL
LitePal
准备
配置
- 环境
//app/build.gradle
dependencies{
...
implementation 'org.litepal.guolindev:core:3.1.1'//3.1.1为Litepal最新版本号
}
- 文件
在app/scr/main下创建assets目录,再建litepal.xml文件,可切换project模式,New->Folder->assets即可
<?xml version="1.0" encoding="utf-8"?>
<litepal>
<dbname value="Record"></dbname>
<version value="1"></version>
<list>
<mapping class="com.example.uichat.record"></mapping>
</list>
</litepal>
- AndroidManifest.xml
<application
android:name="org.litepal.LitePalApplication"
...
添加数据
Button updateData=(Button)findViewById(R.id.update_button);
updaateData.swtOnClickListener(new View.OnClickListener(){
public void onClick(View v){
Book book=new Book();
book.setName("The Lost Symbol");
book.setAuthor("Amy");//添加数据
...
book.save();
//book.setAuthor("Judy");//更新
//book.save();
}
})
更新数据
Book book=new Book();//实例
book.setName("The Lost Symbol");//要更新的部分
book.setAuthor("Amy");
book.updateAll("press =? and prices=?","Anthor",43);//设定条件,满足则更新,不设定将会更新所有
将所有数重设为默认值
Book book=new Book();
book.setToDefault("pages");//将所有书以上是关于android学习之 数据存储全方案的主要内容,如果未能解决你的问题,请参考以下文章
客户端相关知识学习之Android H5交互Webview实现localStorage数据存储