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数据存储

Android学习之基础知识九 — 数据存储(持久化技术)之使用LitePal操作数据库

Android 学习之多状态布局的一种实现方案

Android 学习之多状态布局的一种实现方案

Android 学习之多状态布局的一种实现方案

安卓学习之持久化