1.SharePreference
SharePreferences是用来存储一些简单配置信息的一种机制,使用Map数据结构来存储数据,以键值对的方式存储,采用了XML格式将数据存储到设备中,文件存放在/data/data/<package name>/shared_prefs目录下。
getSharedPreferences(name,mode)
方法的第一个参数用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上;
方法的第二个参数指定文件的操作模式,共有四种操作模式。
四种操作模式分别为:
1. MODE_APPEND: 追加方式存储
2. MODE_PRIVATE: 私有方式存储,其他应用无法访问
3. MODE_WORLD_READABLE: 表示当前文件可以被其他应用读取
4. MODE_WORLD_WRITEABLE: 表示当前文件可以被其他应用写入
数据的存储和读取案例
public class DataActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_data);
Button sharePreferenceSaveButton = findViewById(R.id.share_preference_save_button);
sharePreferenceSaveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences sharedPreferences = getSharedPreferences("xuliwei", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("name","xuliwei");
editor.putInt("age",26);
editor.commit();//提交修改
}
});
Button sharePreferenceReadButton = findViewById(R.id.share_preference_read_button);
sharePreferenceReadButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences sharedPreferences = getSharedPreferences("xuliwei", Context.MODE_WORLD_READABLE);
String name=sharedPreferences.getString("name","");
int age=sharedPreferences.getInt("age",0);
Toast.makeText(DataActivity.this, "name:"+name+"age: "+age, Toast.LENGTH_LONG).show();
}
});
}
}
2. SQLite数据库
数据类型: integer 整型 real 浮点型 text 文本 blob 二进制
SQLite 通过实现SQLiteOpenHelper这个抽象方法实现数据库创建和增删改查
public DatabaseHelper(Context context, String name, CursorFactory factory, int version)
context:Context类型,上下文对象
name:String类型,数据库的名称
factory:CursorFactory类型
version:int类型,数据库版本
//下面是这个类的几个方法:
getReadableDatabase() // 创建或打开一个数据库 可以通过这两个方法返回的SQLiteDatabase对象对数据库进行一系列的操作
getWritableDatabase() //创建或打开一个可以读写的数据库
onCreate(SQLiteDatabase db) //第一次创建的时候调用
onOpen(SQLiteDatabase db) //打开数据库
onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) //升级数据库
onDowngrade(SQLiteDatabase db,int oldVersion,int newVersion) //降级数据库
close() //关闭所有打开的数据库对象
getWritableDatabase和getReadableDatabase的区别
getWritableDatabase取得的实例不是仅仅具有写的功能,而是同时具有读和写的功能
同样的,getReadableDatabase取得的实例也是具对数据库进行读和写的功能
两者的区别在于
getWritableDatabase取得的实例是以读写的方式打开数据库,如果打开的数据库磁盘满了,此时只能读不能写,此时调用了getWritableDatabase的实例,那么将会发生错误(异常)
getReadableDatabase取得的实例是先调用getWritableDatabase以读写的方式打开数据库,如果数据库的磁盘满了,此时返回打开失败,继而用getReadableDatabase的实例以只读的方式去打开数据库
onCreate和onUpgrade的区别,当数据库已存在,并已存在某一表格,想要新建一个表,由于表已存在,直接调用onCreate会报错,通常使用onUpgrade先删除表,然后重新调用onCreate重新创建表
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_USER);
Toast.makeText(mContext, "database 数据库, 新建成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists User");
db.execSQL("drop table if exists Good");
onCreate(db);
}
下面分别展开介绍创建数据库、数据库的增删改查
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_USER = "create table User ("
+ "id integer primary key autoincrement, "
+ "username text, "
+ "height real, "
+ "age integer)";
public static final String CREATE_Good = "create table User ("
+ "id integer primary key autoincrement, "
+ "name text, "
+ "weight real)";
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 db) {
db.execSQL(CREATE_USER);
Toast.makeText(mContext, "database 数据库, 新建成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists User");
db.execSQL("drop table if exists Good");
onCreate(db);
}
}
2.1 创建数据库
MyDatabaseHelper dbHelper = new MyDatabaseHelper(this, "database.db", null, 1);
Button createDatabase = (Button) findViewById(R.id.create_database);
//创建数据库database
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbHelper.getWritableDatabase();
}
});
2.2 新增数据
//增加数据
Button addData = (Button) findViewById(R.id.add_data);
addData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
// 第一条数据
values.put("username", "xuliwei");
values.put("height", 179.5);
values.put("age", 26);
db.insert("User", null, values); // 插入第一条数据
values.clear();
// 第二条数据
db.execSQL("insert into User(username,height,age) values (?,?,?)",new String[]{"tony","175","26"});
}
});
2.3 修改数据
//更新数据
Button updateData = (Button) findViewById(R.id.update_data);
updateData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("age", 18);
db.update("User", values, "username = ?", new String[] { "xuliwei" });
db.execSQL("update User set age = ? where username = ?",,new String[]{"11","tony"});
}
});
2.4 查询数据
//查询数据
Button queryButton = (Button) findViewById(R.id.query_data);
queryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 查询User表中所有的数据
// Cursor cursor = db.query("User", null, null, null, null, null, null);
Cursor cursor = db.rawQuery("select * from User",null);
if (cursor.moveToFirst()) {
do {
// 遍历Cursor对象,取出数据并打印
@SuppressLint("Range") String username = cursor.getString(cursor.getColumnIndex("username"));
@SuppressLint("Range") double height = cursor.getDouble(cursor.getColumnIndex("height"));
@SuppressLint("Range") int age = cursor.getInt(cursor.getColumnIndex("age"));
Log.d("MainActivity", "姓名 " + username);
Log.d("MainActivity", "身高 " + height);
Log.d("MainActivity", "年龄 " + age);
} while (cursor.moveToNext());
}
cursor.close();
}
});
2.5 删除数据
//删除数据
Button deleteButton = (Button) findViewById(R.id.delete_data);
deleteButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("User", "age > ?", new String[] { "18" });
db.execSQL("delete from User where age > 18");
}
});