Android的数据存储方式有三种,分别为File(文件)、SharedPreferences(键值对)、SQLite(轻量级数据库)。
一、文件存储:
文件存储的使用直接上代码,代码均有详细注释,非常好理解~package com.example.mjon.myapplication; import android.content.Context; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.EditText; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class MainActivity extends AppCompatActivity { private EditText ed; private FileOutputStream fileOutputStream; private BufferedWriter bufferedWriter; private FileInputStream fileInputStream; private BufferedReader bufferedReader; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ed = (EditText) findViewById(R.id.ed); } /** * 读入数据 */ @Override protected void onResume() { super.onResume(); try { StringBuilder stringBuilder = new StringBuilder(); //用于存放取出的数据 fileInputStream = openFileInput("data"); //通过openFileInput()打开文件,返回一个文件输入流对象 bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream)); //借助返回的文件输入流对象构建读入流对象,接着构建出读取缓冲对象 String temp = ""; //用于临时保存每行读出的数据 while ((temp = bufferedReader.readLine()) != null) { //每读取一行,追加保存一次,直到读取到末尾 stringBuilder.append(temp); } ed.setText(stringBuilder.toString()); } catch (Exception e) { e.printStackTrace(); } finally { try { if (bufferedReader != null) { //如果读取缓冲对象有数据则关闭 bufferedReader.close(); } } catch (Exception e) { e.printStackTrace(); } } } /** * 写出数据 */ @Override protected void onDestroy() { super.onDestroy(); String temp = ed.getText().toString(); try { fileOutputStream = openFileOutput("data", Context.MODE_PRIVATE); //通过openFileOutput()打开或创建文件,返回文件输出流对象 bufferedWriter = new BufferedWriter(new OutputStreamWriter(fileOutputStream)); //借助返回的文件输出流对象构建出写出流对象,再借助写出流对象构建出写出缓冲对象 bufferedWriter.write(temp); //通过写出缓冲对象写出数据 } catch (Exception e) { e.printStackTrace(); } finally { try { if (bufferedWriter != null) { //如果写出缓冲流中有数据则关闭 bufferedWriter.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
二、SharedPrederences(键值对):
SharedPreferences使用键值对保存数据;
获取SharedPreferences实例的三种方法:
Context:getSharedPreferences("文件名",MODE_PRIVATE);
Activity:getPreferences(MODE_PRIVATE);
PreferenceManager:getDefaultSharedPreferences(Context);
模式:
MODE_PRIVATE
MODE_WORLD_READABLE、MODE_WORLD_WRITEABLE(安全性问题~~4.2版本开始已被废弃)
MODE_MULTI_PROCESS(6.0版本开始已被废弃)
保存数据:SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
读取数据:SharedPreferences sp = getSharedPreferences("data",MODE_PRIVATE);
package com.example.mjon.myapplication; import android.content.SharedPreferences; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; public class MainActivity extends AppCompatActivity { private EditText user; private EditText sex; private Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); user = (EditText) findViewById(R.id.user); sex = (EditText) findViewById(R.id.sex); btn = (Button) findViewById(R.id.btn); btn.setOnClickListener(listener); } /** * 保存数据 */ View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View view) { switch (view.getId()) { case R.id.btn: String users = user.getText().toString(); String sexs = sex.getText().toString(); SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit(); //获取sp.editor实例,第一个参数为文件名,第二个参数为文件模式 editor.putString("username", users); //使用put方法保存数据 editor.putString("sex", sexs); editor.apply(); //提交 break; default: break; } } }; /** * 读取数据 */ @Override protected void onResume() { super.onResume(); SharedPreferences sp = getSharedPreferences("data", MODE_PRIVATE); //获取sp实例,第一个参数为文件名,第二个参数为文件模式 String user_temp = sp.getString("username", ""); //通过get方法获取数据 String sex_temp = sp.getString("sex", ""); user.setText(user_temp); sex.setText(sex_temp); } }
三、SQLite:
Ⅰ、通过帮助类操作:
①创建数据库、创建表、添加表(升级数据库)
package com.example.mjon.myapplication;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
/**
* 使用Android提供的帮助类,实现2+1( onCreate() + onUpgrade() + MyDatabaseHelper()构造器 )
*/
public class MyDatabaseHelper extends SQLiteOpenHelper {
private Context mcontext;
//建表
private static final String CREATE_BOOK = "create table Book(" +
"id integer primary key autoincrement," +
"author text," +
"price real," +
"pages integer," +
"name text)";
private static final String CREATE_CATEGORY = "create table Category(" +
"id integer primary key autoincrement," +
"category_name text," +
"category_code integer)";
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);
sqLiteDatabase.execSQL(CREATE_CATEGORY);
Log.d("OK", "创建成功");
}
//添加表(先删再创,否则系统检查到已存在表则会报错,程序直接崩溃)
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("drop table if exists Book");//先删
onCreate(sqLiteDatabase);//再创
}
}
package com.example.mjon.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper myDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1); //实例化对象(Context,Database_name,Cursor,version)
TextView tv = (TextView) findViewById(R.id.tv);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
myDatabaseHelper.getWritableDatabase(); //创建数据库+建表/添表(改变version值↑)
}
});
}
}
首先,创建一个继承与SQLiteOpenHelper的子类,实现2+1(onCreate() + onUpgrade() + MyDatabaseHelper()构造器 )。然后先定义一条建表的SQL语句,接着在onCreate()方法中通过sqLiteDatabase.execSQL()执行SQL语句;最后,在Activity中实例化SQLiteOpenHelper的子类,并传递三个参数,通过调用myDatabaseHelper.getWritableDatabase()方法对数据库进行正式操作。
如果想添加表,就在SQLiteOpenHelper的子类中添加一条SQL建表语句,然后在onCreate()方法中添加sqLiteDatabase.execSQL()去执行SQL语句。!!!注意!!!,当你要添加表的时候,onCreate()方法会再次执行,而之前已经创建的表会再执行一次,但是我们之前已经创建了这张表,当再次执行这条SQL语句的时候,就会报错,程序就会直接崩溃。所以,我们应该在onUpgrade()方法中,先把原表删除,再调用onCreate()方法创表。然后在Activity中把SQLiteOpenHelper的子类的实例化对象的参数改下,就把版本号+1就行,这样新添的表就会得到创建。
不过你会发现,当你执行onUpgrade()方法把表删除的时候,表中的数据也会没了。这时你就需要根据实际需求写一大段逻辑去控制了~~~因而,使用这种方法去操作数据库对我们并不是很友好,特别是对Java基础不太好的人来说。所以如果你想不使用一条SQL语句,又能简单操作数据库的话,那么直接翻到本文章末尾,直接看另外一篇博文~~
执行SQL语句要使用的对象有:.getWritableDatabase()
.getReadableDatabase()
②添加数据:
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase(); //执行SQL语句要使用的对象
ContentValues values = new ContentValues(); //实例化ContentVaules对象,用于存放数据
values.put("name", "The Da Vinci Code");
values.put("author", "Dan Brown");
values.put("pages", 454);
values.put("price", 16.96);
db.insert("Book", null, values); //执行插入,参数:表名,未指定添加数据的情况下给一些可为空的列自动赋值(就是存在一个列,然后你添加数据的时候没有给值,就默认给它个Null),ContentValues
③更新数据:
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase(); //执行SQL语句要使用的对象
ContentValues values = new ContentValues(); //实例化ContentValues对象,用于存放数据
values.put("price", 99.99);
db.update("Book", values, "author=?", new String[]{"Tom Davity"}); //执行更新,参数:表名,ContentValues,约束条件,约束条件的具体值
④删除数据:
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase(); //执行SQL语句要使用的对象
db.delete("Book", "pages>?", new String[]{"500"}); //执行删除,参数:表名,约束条件,约束条件的具体值
⑤查询数据:
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase(); //执行SQL语句要使用的对象
Cursor cursor = db.query("Book",null,null,null,null,null,null); //执行查询
//表名,查询的列名,约束条件,约束条件的具体值,需要Group by的列,having(进一步过滤),查询结果的排序方式
查询数据会返回一个Cursor(游标),然后移动游标取出数据~
if(cursor.moveToFirst()){
do{
String id = cursor.getString(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String price = cursor.getString(cursor.getColumnIndex("price"));
String author = cursor.getString(cursor.getColumnIndex("author"));
stringBuilder.append(id + ";" + name + ";" + price + ";" + author);
}while(cursor.moveToNext());
}
Ⅱ、使用SQL操作数据库:
①添加数据:
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase(); //执行SQL语句要使用的对象
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)", new String[]{"SQLite","Tom", "260", "25.30"});
②更新数据:
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase(); //执行SQL语句要使用的对象
db.execSQL("update Book set price = ? where pages = ?", new String[]{"88.88", "454"});
③删除数据:
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase(); //执行SQL语句要使用的对象
db.execSQL("delete from Book where pages > ?", new String[]{"300"});
④查询数据:
SQLiteDatabase db = myDatabaseHelper.getWritableDatabase(); //执行SQL语句要使用的对象
Cursor cursor = db.rawQuery("select * from Book", null); //注意此处区别!!!使用的是rawQuery()不是query()
if (cursor.moveToFirst()) {
do {
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
String pages = cursor.getString(cursor.getColumnIndex("pages"));
String price = cursor.getString(cursor.getColumnIndex("price"));
Log.e("OK", name + "," + author + "," + pages + "," + price);
} while (cursor.moveToNext());
}
}
以上SQLite数据库操作使用的是SQLiteDatabases和SQL方式来操作,适合掌握基本SQL语句的人。如果不想使用SQL语句操作数据库,可以使用LitePal开源Android数据库框架来对数据库进行操作,使用它则可以不用编写一行SQL语句,其使用方式要优于SQL语句(仅为个人观点,萝卜青菜各有所爱~)。
有兴趣的话可以单击此处查看另一篇博客:SQLite数据库操作之LitePal