当前位置:   article > 正文

android开发,使用kotlin学习数据存储_android studio如何用kotlin将sql查询结果遍历?

android studio如何用kotlin将sql查询结果遍历?

目录

1、文件存储

(1)将数据存储在文件中

(2) 从文件中读取数据

(3)实战演练:重新启动程序时EditText中能保留我们上次输入的内容。、

2、SharedPreferences存储

(1)将数据存储到SharedPreferences中

(2)从sharedpreferences中读取数据

3、SQLite数据库存储

(1)创建数据库

(2)升级数据库

(3)添加数据

(4)更新数据

(5)删除数据

(6)查询数据

4、使用SQL操作数据库


1、文件存储

文件存储是Android中最基本的数据存储方式,它不对存储的内容进行任何格式化处理,有数据都是原封不动地保存在文件当中的,因此它比较适合存储一些简单的文本数据或者二进制数据。

(1)将数据存储在文件中

Context类中提供了一个openFileOutput()方法,用于将数据存储到指定的文件中。

第一个参数:文件名(系统会自动创建这个文件)。

第二个参数:文件的操作模式

文件的操作模式有以下几种:

  • Context.MODE_PRIVATE:私有覆盖模式。只能被当前应用访问,并且如果写入,则覆盖。
  • Context.MODE_APPEND:私有追加模式。只能被当前应用访问,并且如果写入,则追加。
  • Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE已在Android4.2版本中被废除。

具体实现: 

  1. private fun save(inputText: String) {
  2. try {
  3. val output=openFileOutput("data", Context.MODE_PRIVATE)
  4. val writer=BufferedWriter(OutputStreamWriter(output))
  5. //这里使用了kotlin的内置函数use,它会保证在Lambda
  6. //表达式中的代码全部执行完之后自动将外层的流关闭,这
  7. //样就不再需要我们写一个finally语句,手动关闭流。
  8. writer.use {
  9. it.write(inputText)
  10. }
  11. Toast.makeText(this,inputText,Toast.LENGTH_SHORT).show()
  12. }catch (e:IOException){
  13. e.printStackTrace()
  14. }
  15. }

 如何证实数据是否已经保存成功了呢?

使用快捷键Ctrl+Shift+A(Mac系统是command+shift+A)打开搜索功能,在搜索框输入“Device File Explorer”即可找到这个工具,我们在这工具里找到/data/data/com.example.filepersistencetest/files/目录,里面有一个生成的data文件,双击打开,查看里面的内容。

(2) 从文件中读取数据

Context类提供的openFileinput()方法,用于从文件中读取数据。

参数:文件名

具体实现:

  1. private fun load():String{
  2. val content=StringBuilder()
  3. try {
  4. val input=openFileInput("data")
  5. val reader=BufferedReader(InputStreamReader(input))
  6. //kotlin提供的内置扩展函数forEachLine,它会将读到的内容都回调到Lambda表达式中。
  7. reader.use {
  8. reader.forEachLine {
  9. content.append(it)
  10. }
  11. }
  12. }catch(e:IOException){
  13. e.printStackTrace()
  14. }
  15. return content.toString()
  16. }

(3)实战演练:重新启动程序时EditText中能保留我们上次输入的内容。、

  1. class MainActivity : AppCompatActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. setContentView(R.layout.activity_main)
  5. val inputText=load()
  6. if(inputText.isNotEmpty()){
  7. val editText:EditText=findViewById(R.id.editText)
  8. editText.setText(inputText)
  9. editText.setSelection(inputText.length)
  10. }
  11. }
  12. override fun onDestroy() {
  13. super.onDestroy()
  14. val editText:EditText=findViewById(R.id.editText)
  15. val inputText=editText.text.toString()
  16. save(inputText)
  17. }
  18. private fun save(inputText: String) {
  19. try {
  20. val output=openFileOutput("data", Context.MODE_PRIVATE)
  21. val writer=BufferedWriter(OutputStreamWriter(output))
  22. writer.use {
  23. it.write(inputText)
  24. }
  25. Toast.makeText(this,inputText,Toast.LENGTH_SHORT).show()
  26. }catch (e:IOException){
  27. e.printStackTrace()
  28. }
  29. }
  30. private fun load():String{
  31. val content=StringBuilder()
  32. try {
  33. val input=openFileInput("data")
  34. val reader=BufferedReader(InputStreamReader(input))
  35. reader.use {
  36. reader.forEachLine {
  37. content.append(it)
  38. }
  39. }
  40. }catch(e:IOException){
  41. e.printStackTrace()
  42. }
  43. return content.toString()
  44. }
  45. }

2、SharedPreferences存储

不同于文件存储,SharedPreferences是使用键值对的方式来存储数据的。

Context类中的getSharedPreferences()方法,获取SharedPreferences对象。

第一个参数:指定SharedPreferences文件的名称。(如果指定文件的名称不存在就会创建一个,SharedPreferences文件都是存放在/data/data/<package name>/shared_prefs目录)。

第二个参数:指定操作模式。只有MODE_PRIVATE可选,MODE_PRIVATE:只有当前的应用程序才可以对这个SharedPreferences文件进行读写。

(1)将数据存储到SharedPreferences中

具体实现:

  1. val editor=getSharedPreferences("data", Context.MODE_PRIVATE).edit()
  2. editor.putString("name","Tom")
  3. editor.putInt("age",28)
  4. editor.putBoolean("married",false)
  5. editor.apply()//提交

如何证实数据是否已经保存成功了呢?

使用快捷键Ctrl+Shift+A(Mac系统是command+shift+A)打开搜索功能,在搜索框输入“Device File Explorer”即可找到这个工具,我们在这工具里找到/data/data/com.example.sharedpreferencestest/shared_prefs/目录,里面有一个生成的data.xml文件,双击打开,查看里面的内容。

(2)从sharedpreferences中读取数据

具体实现

  1. val prefs=getSharedPreferences("data",Context.MODE_PRIVATE)
  2. val name=prefs.getString("name","")
  3. val age=prefs.getInt("age",0)
  4. val married=prefs.getBoolean("married",false)
  5. Log.d("MainActivity","name is $name")
  6. Log.d("MainActivity","age is $age")
  7. Log.d("MainActivity","married is $married")

3、SQLite数据库存储

(1)创建数据库

SQLiteOpenHelper类是一个抽象类,有两个抽象方法,onCreate()和onUpgrade()。

  • onCreate(SQLiteDatabase):在数据第一次生成的时候会调用这个方法,也就是说,只有创建数据库的时候才会调用,还可以在这个方法里生成数据库表。
  • onUpgrade(SQLiteDatabase,int,int):当数据库需要升级的时候,Android系统会自动调用这个方法,一般在这个方法里删除数据表,并建立新的数据表。

SQLiteOpenHelper类的构造方法:

第一个参数:Context

第二个参数:数据库名

第三个参数:运行我们在查询数据时放回一个自定义的Cursor,一般传入null即可

第四个参数:表明当前数据库的版本号

步骤

定义SQLiteOpenHelper的子类,在该类中创建一个名为BookStore.db的数据库

  1. class MyDatabaseHelper(val context: Context,name:String,version:Int) :SQLiteOpenHelper(context,name,null,version) {
  2. private val createBook = "create table Book(" +
  3. " id integer primary key autoincrement," +
  4. "author text," +
  5. "price real," +
  6. "pages integer," +
  7. "name text)"
  8. private val createCategory = "create table Category(" +
  9. "id integer primary key autoincrement," +
  10. "category_name text," +
  11. "category_code integer)"
  12. override fun onCreate(p0: SQLiteDatabase?) {
  13. if (p0 != null) {
  14. p0.execSQL(createBook)
  15. p0.execSQL(createCategory)
  16. }
  17. Toast.makeText(context,"Create succeeded",Toast.LENGTH_SHORT).show()
  18. }
  19. override fun onUpgrade(p0: SQLiteDatabase?, p1: Int, p2: Int) {
  20. if (p0 != null) {
  21. p0.execSQL("drop table if exists Book")
  22. p0.execSQL("drop table if exists Category")
  23. onCreate(p0)
  24. }
  25. }
  26. }

调用MyDatabaseHelper类完成表的创建

  1. class MainActivity : AppCompatActivity() {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. setContentView(R.layout.activity_main)
  5. val dbHelper=MyDatabaseHelper(this,"BookStore.db",1)
  6. dbHelper.writableDatabase
  7. }
  8. }

(2)升级数据库

val dbHelper=MyDatabaseHelper(this,"BookStore.db",1)

改为

val dbHelper=MyDatabaseHelper(this,"BookStore.db",2)

表示数据库升级

(3)添加数据

insert():专门用于添加数据。

第一个参数:表名

第二个参数:用于在未指定添加数据的情况下给某些可为空的列自动赋值给NULL,一般用不到这个功能,传入null即可。

第三个参数:ContentValues对象

 步骤

获取SQLiteDatabase对象

  1. val dbHelper=MyDatabaseHelper(this,"BookStore.db",1)
  2. val db=dbHelper.writableDatabase

使用ContentValues对要添加的数据进行组装

  1. val values1=ContentValues().apply {
  2. put("name","The Da Vinci Code")
  3. put("author","Dan Brown")
  4. put("pages",454)
  5. put("price",16.96)
  6. }

调用insert()方法将数据添加到表中

db.insert("Book",null,values1)

(4)更新数据

updata():对数据进行更新。

参数:第一个参数:表名,指定更新哪张表的数据。

第二个参数:ContentValues对象,要把更新数据在这里组装进去。

第三、四个参数:用于约束更新某一行或某几行的数据,不指定的话默认会更新所有行

步骤

获取SQLiteDatabase对象

  1. val dbHelper=MyDatabaseHelper(this,"BookStore.db",1)
  2. val db=dbHelper.writableDatabase

构建ContentValues对象,并且给它指定一组数据,说明把价格这一系列的数据更新成10.99。

  1. val values=ContentValues()
  2. values.put("price",10.99)

调用SQLiteDatabase的updata()执行具体的更新操作。

 db.update("Book",values,"name=?", arrayOf("The Da Vinci Code"))

(5)删除数据

delete()方法:专门用于删除数据。

第一个参数:表名

第二、三个参数:用于约束删除某一行或者某几行的数据,不指定的话会默认删除所有行

  1. val dbHelper=MyDatabaseHelper(this,"BookStore.db",1)
  2. val db=dbHelper.writableDatabase
  3. db.delete("Book","pages>?", arrayOf("500"))

(6)查询数据

步骤

获取SQLiteDatabase对象

  1. val dbHelper=MyDatabaseHelper(this,"BookStore.db",1)
  2. val db=dbHelper.writableDatabase

调用query()方法后会返回一个Cursor对象,查询到的所有数据都可以从这个对象中取出。

  1. val cursor=db.query("Book",null,null,null,null,null,null)
  2. //查询完后获得一个Cursor对象,接着我们调用它的moveToFirst()方法,
  3. //将数据的指针移动到第一行的位置,
  4. //然后进入一个循环当中,去遍历查询到的每一行数据
  5. if(cursor.moveToFirst()){
  6. do{
  7. val name=cursor.getString(cursor.getColumnIndex("name"))
  8. val author=cursor.getString(cursor.getColumnIndex("author"))
  9. val pages=cursor.getInt(cursor.getColumnIndex("pages"))
  10. val price=cursor.getDouble(cursor.getColumnIndex("price"))
  11. Log.d("MainActivity","Book name is $name")
  12. Log.d("MainActivity","Book author is $author")
  13. Log.d("MainActivity","Book pages is $pages")
  14. Log.d("MainActivity","Book price is $price")
  15. }while (cursor.moveToNext())
  16. }
  17. cursor.close()

4、使用SQL操作数据库

使用SQL来完成前面学过的CRUD操作。

添加数据:

  1. db.execSQL("insert  into Book(name, author, pages, price)  values(?,?,?,?)",
  2. array0f("The  Da  Vinci  Code","Dan  Brown","454","16.96")
  3. )
  4. db.execSQL("insert into Book(name, author, pages, price) values(?,?,?,?)",
  5. array0f("The  Lost  Symbol","Dan  Brown","510","19.95")
  6. )

更新数据:

db.execSQL("update Book set price=? where name=?",array0f("10.99","The Da Vinci Code"))

删除数据:

db.execSQL("delete  from Book where  pages>?",array0f("500"))

查询数据:

val cursor=db.rawQuery("select*from Book", null)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/1009310
推荐阅读
相关标签
  

闽ICP备14008679号