1. 参考
「 持 久 化 技 术 」 的 项 目
, 创 建 一 个 对 外 的 ContentProvider 以供使用。
2.
新建一个应用程序,应用的名字自拟。
3.
应用程序中包含一个
MainActivity
,为默认登陆
Activity
:
(
1
) 其布局包含:
1
个
RecyclerView
、
1
个「查询」按钮。
(
2
)
RecyclerView
用来展示书单,展示的内容包括:书名、作者、价格。
(
3
) 按钮用来查询「网上图书馆」应用中的所有图书信息,用来更新
RecyclerView
中的数据。
(
4
)
RecyclerView
的列项可以点击;点击时,跳转到
BookActivity
。
4. BookActivity
用于展示图书的所有信息:
(
1
) 其布局包含
1
个
RecyclerView
和
1
个「返回」按钮。
(
2
)
RecyclerView
完整展示了图书的所有信息,即书名、作者、价格、页数、类别。
(
3
) 「返回」按钮则用来返回到
MainActivity
。
要想实现资源的共享,重点是实现两台机子的连接,请求方得到共享方的访问权限即可。使用ContentProvider实现该功能,具体如何实现可以仔细看我的代码。
运行截图:
一)先运行
mylibrary
这个
app
我的数据如下
![](https://i-blog.csdnimg.cn/direct/79530b5404384d99851539b13c538e6e.png)
![](https://i-blog.csdnimg.cn/direct/4ea7e2a93b3f4a59b2165a5aaad5f286.png)
二)然后再运行另一个
app
![](https://i-blog.csdnimg.cn/direct/0b8423c79aee4765a467fcfa7a888ec8.png)
三)
点击查询刷新数据(这里我已经添加过数据了,所以可以查询到数据
![](https://i-blog.csdnimg.cn/direct/19a198e6584649d590ba287d84873700.png)
四)点击具体列项可以查看所有信息
![](https://i-blog.csdnimg.cn/direct/a69da5ddbdd64ee3849c5ec975413244.png)
![](https://i-blog.csdnimg.cn/direct/34ec79b24a3f41919ae8a1389bb41cab.png)
五)点击返回
![](https://i-blog.csdnimg.cn/direct/673a39a5a1a246aeafe5e54000173937.png)
源码
这里要创建两个项目,一个是共享资源方,一个是请求资源方
项目一:共享资源方
Book.kt
package com.example.mylibrary
import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
@Parcelize
data class Book(
val name: String,
val author: String,
val price: Double,
val pages: Int,
val categoryId: Int
): Parcelable
LoginActivity.kt
package com.example.mylibrary
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.CheckBox
import android.widget.EditText
import android.widget.Toast
class LoginActivity : AppCompatActivity() {
private lateinit var usernameEditText: EditText
private lateinit var passwordEditText: EditText
private lateinit var rememberMeCheckBox: CheckBox
private lateinit var sharedPreferences: SharedPreferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
usernameEditText = findViewById(R.id.usernameEditText)
passwordEditText = findViewById(R.id.passwordEditText)
rememberMeCheckBox = findViewById(R.id.rememberMeCheckBox)
val loginButton: Button = findViewById(R.id.loginButton)
val registerButton: Button = findViewById(R.id.registerButton)
sharedPreferences = getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)
loginButton.setOnClickListener {
val username = usernameEditText.text.toString()
val password = passwordEditText.text.toString()
if (validateLogin(username, password)) {
if (rememberMeCheckBox.isChecked) {
rememberUser(username, password)
}
val intent = Intent(this@LoginActivity, MainActivity::class.java)
startActivity(intent)
// finish()
} else {
Toast.makeText(this@LoginActivity, "Invalid username or password", Toast.LENGTH_SHORT).show()
}
}
registerButton.setOnClickListener {
val username = usernameEditText.text.toString()
val password = passwordEditText.text.toString()
if (registerUser(username, password)) {
Toast.makeText(this@LoginActivity, "Registration successful", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this@LoginActivity, "Username already exists", Toast.LENGTH_SHORT).show()
}
}
}
private fun validateLogin(username: String, password: String): Boolean {
val storedPassword = sharedPreferences.getString(username, null)
return storedPassword == password
}
private fun rememberUser(username: String, password: String) {
val editor = sharedPreferences.edit()
editor.putString(username, password)
editor.apply()
}
private fun registerUser(username: String, password: String): Boolean {
if (!sharedPreferences.contains(username)) {
val editor = sharedPreferences.edit()
editor.putString(username, password)
editor.apply()
return true
}
return false
}
}
DatabaseHelper.kt
package com.example.mylibrary
import android.content.ContentValues
import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import android.widget.Toast
class DatabaseHelper(context: Context, name: String, version: Int) :
SQLiteOpenHelper(context, name, null, version) {
private val createBook = "create table Book (" +
"id integer primary key autoincrement," +
"author text," +
"price real," +
"pages integer," +
"name text," +
"categoryId integer)"
private val 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)
// Toast.makeText(this@DatabaseHelper, "Tables created successfully", Toast.LENGTH_SHORT).show()
// 插入经济类别记录
val contentValues = ContentValues().apply {
put("category_name", "经济类")
put("category_code", 1)
}
db.insert("Category", null, contentValues)
}
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)
}
companion object {
const val TABLE_NAME = "Book"
}
}
AddBookActivity.kt
// AddBookActivity.kt
package com.example.mylibrary
import android.content.ContentValues
import android.content.Intent
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
class AddBookActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_add_book)
val dbHelper = DatabaseHelper(this, "BookStore.db", 2)
val addBookButton: Button = findViewById(R.id.addBookButton)
addBookButton.setOnClickListener {
val nameEditText: EditText = findViewById(R.id.nameEditText)
val authorEditText: EditText = findViewById(R.id.authorEditText)
val priceEditText: EditText = findViewById(R.id.priceEditText)