甘肃建设项目审批权限网站,网站建设制作设计营销 上海,资阳论坛,做电脑网站用什么软件有哪些方面目录
将数据存储到文件中
创建文件和保存数据
读取文件
SharedPreferences存储
存储数据到SharedPreferences中
Context类中的getSharedPreferences()方法
Activity类中的getPreferences()方法
从SharedPreferences中读取数据
SQLite数据库存储
创建数据库
调用数据…目录
将数据存储到文件中
创建文件和保存数据
读取文件
SharedPreferences存储
存储数据到SharedPreferences中
Context类中的getSharedPreferences()方法
Activity类中的getPreferences()方法
从SharedPreferences中读取数据
SQLite数据库存储
创建数据库
调用数据库
操作数据库
增
删
改
查
升级数据库 将数据存储到文件中
创建文件和保存数据
Context类中提供了一个openFileOutput()方法可以用于将数据存储到指定的文件中。这个方法接收两个参数第一个参数是文件名在文件创建的时候使用注意这里指定的文件名不可以包含路径因为所有的文件都默认存储到/data/data/package name/files/目录下第二个参数是文件的操作模式主要有MODE_PRIVATE和MODE_APPEND两种模式可选默认是MODE_PRIVATE表示当指定相同文件名的时候所写入的内容将会覆盖原文件中的内容而MODE_APPEND则表示如果该文件已存在就往文件里面追加内容不存在就创建新文件。其实文件的操作模式本来还有另外两种MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE。这两种模式表示允许其他应用程序对我们程序中的文件进行读写操作不过由于这两种模式过于危险很容易引起应用的安全漏洞已在Android 4.2版本中被废弃。
openFileOutput()方法返回的是一个FileOutputStream对象得到这个对象之后就可以使用Java流的方式将数据写入文件中了。以下是一段简单的代码示例展示了如何将一段文本内容保存到文件中 fun saveFile(saveString: String) {val output openFileOutput(fileName, Context.MODE_PRIVATE)val writer BufferedWriter(OutputStreamWriter(output))writer.use {it.write(saveString)}}
这里通过openFileOutput()方法能够得到一个FileOutputStream对象然后借助它构建出一个OutputStreamWriter对象接着再使用OutputStreamWriter构建出一个BufferedWriter对象这样你就可以通过BufferedWriter将文本内容写入文件中了。
注意这里还使用了一个use函数这是Kotlin提供的一个内置扩展函数。它会保证在Lambda表达式中的代码全部执行完之后自动将外层的流关闭这样就不需要我们再编写一个finally语句手动去关闭流了是一个非常好用的扩展函数。
另外Kotlin是没有异常检查机制checked exception的。这意味着使用Kotlin编写的所有代码都不会强制要求你进行异常捕获或异常抛出。即使你不写try catch代码块在Kotlin中依然可以编译通过。
读取文件
类似于将数据存储到文件中Context类中还提供了一个openFileInput()方法用于从文件中读取数据。这个方法要比openFileOutput()简单一些它只接收一个参数即要读取的文件名然后系统会自动到/data/data/package name/files/目录下加载这个文件并返回一个FileInputStream对象得到这个对象之后再通过流的方式就可以将数据读取出来了。
以下是一段简单的代码示例展示了如何从文件中读取文本数据 fun loadFile(): String {val stringBuilder StringBuilder()val input openFileInput(fileName)val reader BufferedReader(InputStreamReader(input))reader.use {reader.forEachLine {stringBuilder.append(it)}}return stringBuilder.toString()}
在这段代码中首先通过openFileInput()方法获取了一个FileInputStream对象然后借助它又构建出了一个InputStreamReader对象接着再使用InputStreamReader构建出一个BufferedReader对象这样我们就可以通过BufferedReader将文件中的数据一行行读取出来并拼接到StringBuilder对象当中最后将读取的内容返回就可以了。
注意这里从文件中读取数据使用了一个forEachLine函数这也是Kotlin提供的一个内置扩展函数它会将读到的每行内容都回调到Lambda表达式中我们在Lambda表达式中完成拼接逻辑即可。
SharedPreferences存储
存储数据到SharedPreferences中
要想使用SharedPreferences存储数据首先需要获取SharedPreferences对象。Android中主要提供了以下两种方法用于得到SharedPreferences对象。 Context类中的getSharedPreferences()方法 此方法接收两个参数第一个参数用于指定SharedPreferences文件的名称如果指定的文件不存在则会创建一个SharedPreferences文件都是存放在/data/data/package name/shared_prefs/目录下的第二个参数用于指定操作模式目前只有默认的MODE_PRIVATE这一种模式可选它和直接传入0的效果是相同的表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写。其他几种操作模式均已被废弃MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE这两种模式是在Android 4.2版本中被废弃的MODE_MULTI_PROCESS模式是在Android 6.0版本中被废弃的。 Activity类中的getPreferences()方法 这个方法和Context中的getSharedPreferences()方法很相似不过它只接收一个操作模式参数因为使用这个方法时会自动将当前Activity的类名作为SharedPreferences的文件名。 得到了SharedPreferences对象之后就可以开始向SharedPreferences文件中存储数据了主要可以分为3步实现。 (1) 调用SharedPreferences对象的edit()方法获取一个SharedPreferences.Editor对象。 (2) 向SharedPreferences.Editor对象中添加数据比如添加一个布尔型数据就使用putBoolean()方法添加一个字符串则使用putString()方法以此类推。 (3) 调用apply()方法将添加的数据提交从而完成数据存储操作。 代码示例如下 fun saveSharedPreferences(saveString: String){val edit getSharedPreferences(fileName,Context.MODE_PRIVATE).edit()edit.putString(editName,editValue)edit.apply()}
从SharedPreferences中读取数据
SharedPreferences对象中提供了一系列的get方法用于读取存储的数据每种get方法都对应了SharedPreferences.Editor中的一种put方法比如读取一个布尔型数据就使用getBoolean()方法读取一个字符串就使用getString()方法。这些get方法都接收两个参数第一个参数是键传入存储数据时使用的键就可以得到相应的值了第二个参数是默认值即表示当传入的键找不到对应的值时会以什么样的默认值进行返回。
代码示例如下 fun loadSharedPreferences(): String {val sharedPreferences getSharedPreferences(fileName, Context.MODE_PRIVATE)return sharedPreferences.getString(editName, defValue)!!}
SQLite数据库存储
创建数据库
Android为了让我们能够更加方便地管理数据库专门提供了一个SQLiteOpenHelper帮助类借助这个类可以非常简单地对数据库进行创建和升级。既然有好东西可以直接使用那我们自然要尝试一下了下面我就对SQLiteOpenHelper的基本用法进行介绍。
首先你要知道SQLiteOpenHelper是一个抽象类这意味着如果我们想要使用它就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper中有两个抽象方法onCreate()和onUpgrade()。我们必须在自己的帮助类里重写这两个方法然后分别在这两个方法中实现创建和升级数据库的逻辑。
SQLiteOpenHelper中还有两个非常重要的实例方法getReadableDatabase()和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库如果数据库已存在则直接打开否则要创建一个新的数据库并返回一个可对数据库进行读写操作的对象。不同的是当数据库不可写入的时候如磁盘空间已满getReadableDatabase()方法返回的对象将以只读的方式打开数据库而getWritableDatabase()方法则将出现异常。
SQLiteOpenHelper中有两个构造方法可供重写一般使用参数少一点的那个构造方法即可。这个构造方法中接收4个参数第一个参数是Context这个没什么好说的必须有它才能对数据库进行操作第二个参数是数据库名创建数据库时使用的就是这里指定的名称第三个参数允许我们在查询数据的时候返回一个自定义的Cursor一般传入null即可第四个参数表示当前数据库的版本号可用于对数据库进行升级操作。构建出SQLiteOpenHelper的实例之后再调用它的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库了数据库文件会存放在/data/data/package name/databases/目录下。此时重写的onCreate()方法也会得到执行所以通常会在这里处理一些创建表的逻辑。
我们建立一个代码示例如下
class MyDatabaseHelper(private val context: Context,private val databaseName: String,val version: Int
) : SQLiteOpenHelper(context, databaseName, null, version) {private val createTable create table tableName(id integer primary key autoincrement, key1 text, key2 real, key3 integer)override fun onCreate(db: SQLiteDatabase?) {db?.execSQL(createTable)}override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {}
}
调用数据库
val myDatabaseHelper MyDatabaseHelper(this,databaseName,1)
myDatabaseHelper.writableDatabase
操作数据库
增
val myDatabaseHelper MyDatabaseHelper(this, databaseName, 1)
val db myDatabaseHelper.writableDatabase
val value1 ContentValues().apply {put(key1, 111)put(key2, 1.1)put(key3, 1)
}
db.insert(tableName, null, value1)val value2 ContentValues().apply {put(key1, 222)put(key2, 2.2)put(key3, 2)
}
db.insert(tableName, null, value2)
删
db.delete(tableName, key2 ? and key3 ? , arrayOf(2.2,2))
改
val value3 ContentValues().apply {put(key1, 444)}
db.update(tableName, value3, key2 ?, arrayOf(1.1))
查 val course db.query(tableName, null, null, null, null, null, null)if (course.moveToFirst()) {do {println(course.getString(course3.getColumnIndex(key1)))println(course.getString(course.getColumnIndex(key2)))println(course.getString(course.getColumnIndex(key3)))} while (course.moveToNext())}course.close()
升级数据库
在MyDatabaseHelper类中我们还有一个onUpgrade的方法没有使用这个方法就是用来升级数据库的当我们需要升级数据库时改写MyDatabaseHelper的version让它大于我们直接传入的数这样就会自动调用onUpgrade示例代码如下
val myDatabaseHelper MyDatabaseHelper(this, databaseName, 2)
然后我们在onUpgrade方法中编写升级逻辑代码如下
class MyDatabaseHelper(private val context: Context,private val databaseName: String,val version: Int
) : SQLiteOpenHelper(context, databaseName, null, version) {private val createTable create table tableName(id integer primary key autoincrement, key1 text, key2 real, key3 integer)private val createTable2 create table tableName2(id integer primary key autoincrement, key1 text, key2 real, key3 integer)override fun onCreate(db: SQLiteDatabase?) {db?.execSQL(createTable)db?.execSQL(createTable2)}override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {if (oldVersion1){db?.execSQL(createTable2)}}
}
当原来的版本是1时我们就创建表2不然就执行onCreate方法创建表1表2。如果后续我们需要再表1中增加一个字段 tableName_id那么我们将传入的version改成3再在onUpgrade方法中编写如下代码 override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {if (oldVersion1){db?.execSQL(createTable2)}if (oldVersion2){db?.execSQL(alter table tableName add column tableName_id integer)}}
这样我们就能在表1中新增一个tableName_id字段了