override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
val editor = getSharedPreferences("data",Context.MODE_PRIVATE).edit()
// 步骤1:
// 参数1:指定该文件的名称,名称不用带后缀,后缀会由Android自动加上
// 参数2:指定文件的操作模式,共有4种操作模式,分别是:
// Context.MODE_PRIVATE = 0:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
// Context.MODE_APPEND = 32768:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。 (已废弃)
// Context.MODE_WORLD_READABLE = 1:表示当前文件可以被其他应用读取 (已废弃)
// Context.MODE_WORLD_WRITEABLE = 2:表示当前文件可以被其他应用写入 (已废弃)
// 步骤2:通过edit()方法获取编辑器对象
// 步骤3: 以键值对的方式写入数据
editor.putString("name","Tom")
editor.putInt("age",28)
editor.putBoolean("married",false)
// 步骤4: 提交修改
editor.apply()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
val prefs = getSharedPreferences("data",Context.MODE_PRIVATE)
// 步骤1:
// 参数1:指定该文件的名称,名称不用带后缀,后缀会由Android自动加上
// 参数2:指定文件的操作模式,共有4种操作模式,分别是:
// Context.MODE_PRIVATE = 0:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
// Context.MODE_APPEND = 32768:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。 (已废弃)
// Context.MODE_WORLD_READABLE = 1:表示当前文件可以被其他应用读取 (已废弃)
// Context.MODE_WORLD_WRITEABLE = 2:表示当前文件可以被其他应用写入 (已废弃)
val name = prefs.getString("name","")
val age = prefs.getInt("age",0)
val married = prefs.getBoolean("married",false)
// 步骤2:
// getxxx()
// 参数1: 要获取的key
// 参数2 : 默认值(即如果不存在该key时的返回值)
}
class MyDatabaseHelper(val context: Context,name: String,version: Int) : SQLiteOpenHelper(context,name,null,version){
// integer:整型 real:浮点型 text:文本类型 blob:二进制类型
private var createBook = "create table Book ("+
"id integer primary key autoincrement," +
"author text," +
"price real," +
"pages integer," +
"name text)"
override fun onCreate(db: SQLiteDatabase?) {
db?.execSQL(createBook)
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
}
}
class MyDatabaseHelper(val context: Context,name: String,version: Int) : SQLiteOpenHelper(context,name,null,version){
// integer:整型 real:浮点型 text:文本类型 blob:二进制类型
private var createBook = "create table Book ("+
"id integer primary key autoincrement," +
"author text," +
"price real," +
"pages integer," +
"name text)"
private var createCategory = "create table Category("+
"id integer primary key autoincrement,"+
"category_name text,"+
"category_code integer)"
override fun onCreate(db: SQLiteDatabase?) {
db?.execSQL(createBook)
db?.execSQL(createCategory)
}
// 在onUpgrade()方法中执行两条drop语句,如果发现数据库中已经存在表就删除,然后调用onCreate()重新创建
// 怎么让onUpgrade()执行,就是version参数,它表示数据库的版本号,只要现在的版本号大于之前版本号,就会执行该方法
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
db?.execSQL("drop table if exists Book")
db?.execSQL("drop table if exists Category")
onCreate(db)
}
}
SQLiteDatabase中提供了一个insert()方法,专门用于添加数据。它接收3个参数:
1.表名(希望向哪张表添加数据)
2.用于在未指定添加数据的情况下给某些可能为空的列自动赋值NULL,一般不会使用,直接传入null即可
3.一个ContentValues对象,提供了一系列的put()方法重载,用于向ContentValues中添加数据
代码如下:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
val dbHelper = MyDatabaseHelper(this,"BookStore.db",2)
val db = dbHelper.writableDatabase
val values = ContentValues().apply {
put("name","David")
put("author","Dan Brown")
put("pages",454)
put("price",16.69)
}
db.insert("Book",null,values)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
// 1. 获取到SQLiteDatabase对象来对数据库进行操作
var dbHelper = MyDatabaseHelper(this,"Book_store.db",1)
// 2.通过SQLiteDatabase的getWritableDatabase获得可以向数据库进行读写操作的对象db
val db = dbHelper.writableDatabase
// 3.得到一个ContentValues对象用来组装数据
val values = ContentValues()
values.put("price",10.09)
// 4.arrayOf()方法是Kotlin提供的一种用于便捷创建数组的内置方法
db.update("Book",values,"name=?", arrayOf("David"))
}
CRUD中最难的操作,提供了一个query()方法,该方法接收7个参数:
1.表名
2.指定去查询哪几列,默认所有列
3,4.用于约束查询一行或者某几行的数据,不指定则默认所有行
5.指定需要group by的列
6.对group by之后的数据进行进一步过滤
7.指定查询结果的排序方式
代码如下:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
// 1. 获取到SQLiteDatabase对象来对数据库进行操作
var dbHelper = MyDatabaseHelper(this,"Book_store.db",1)
// 2. 通过SQLiteDatabase的getWritableDatabase获得可以向数据库进行读写操作的对象db
val db = dbHelper.writableDatabase
// 3. 查询Book的所有数据
val cursor = db.query("Book",null,null,null,null,null,null)
//4. 遍历Cursor对象,取出数据
if (cursor.moveToFirst()) {
do {
val name = cursor.getString(cursor.getColumnIndex("name"))
val author = cursor.getString(cursor.getColumnIndex("author"))
val pages = cursor.getInt(cursor.getColumnIndex("pages"))
}while (cursor.moveToNext())
}
cursor.close()
}
// 使用SQL的增删改查
db.execSQL("insert into Book(name,author,pages,price) values(?,?,?,?)", arrayOf("David","Dan Brown","454","16.96"))
db.execSQL("update Book set price = ? where name = ?", arrayOf("10.99","David"))
db.execSQL("delete from Book where pages > ?", arrayOf("500"))
val query = db.rawQuery("select * from Book",null)
// 首先得到一个FileOutputStream对象,得到这个对象后就可以将数据写入文件中了
// use函数是Kotlin提供的一个内置扩展函数,它会保证在Lambda表达式中的代码全部执行完成后自动关闭外层的流
// 这样就不需要手动去关闭流了
private fun save(inputText:String) {
try {
val output = openFileOutput("data",Context.MODE_PRIVATE)
val write = BufferedWriter(OutputStreamWriter(output))
write.use {
it.write(inputText)
}
}catch (e : IOException) {
e.printStackTrace()
}
}
// 首先通过openFileInput()获取了一个FileInputStream对象,然后通过它构建出了一个InputStreamReader对象
// 再通过InputStreamReader构建出了BufferedReader对象
// forEachLine函数是Kotlin的一个内置扩展函数,会将读取到的每行内容都回调到Lambda表达式中
private fun load(): String {
val content = StringBuilder()
try {
val input = openFileInput("data")
val reader = BufferedReader(InputStreamReader(input))
reader.use {
reader.forEachLine {
content.append(it)
}
}
}catch (e : IOException) {
e.printStackTrace()
}
return content.toString()
}