用初学者的角度,用安卓写一个课表,可以添加课表、查看课表、修改课表,数据库用Sqlite,带有注解
时间: 2023-11-28 09:50:21 浏览: 78
安卓源码 sqlite的一些基本操作,包括数据库创建、数据库版本升级、创建表、数据的增删改查.zip
好的,我会尽可能详细地为你解答。
首先,你需要创建一个安卓项目。在创建项目时,可以选择使用 Kotlin 或 Java 作为主要编程语言。这里以 Kotlin 为例,具体步骤如下:
1. 打开 Android Studio,点击“Start a new Android Studio project”。
2. 在“Create New Project”窗口中,填写应用程序名称和包名。
3. 选择“Kotlin”作为语言。
4. 选择“Empty Activity”作为模板。
5. 点击“Finish”。
接下来,我们来一步步实现添加、查看和修改课表的功能。
1. 添加课表
首先,我们需要创建一个数据表来存储课程信息。在 Android 中,可以使用 SQLite 数据库来存储数据。可以在 `AndroidManifest.xml` 文件中添加以下代码来声明使用 SQLite:
```xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```
接下来,我们需要创建一个 `Course` 数据类来存储课程信息。代码如下:
```kotlin
data class Course(
var id: Int = 0,
var name: String = "",
var teacher: String = "",
var room: String = "",
var time: String = ""
)
```
然后,我们需要创建一个 `CourseDbHelper` 类来帮助我们管理数据库。代码如下:
```kotlin
class CourseDbHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
companion object {
private const val DATABASE_VERSION = 1
private const val DATABASE_NAME = "course.db"
private const val TABLE_NAME = "course"
private const val ID = "id"
private const val NAME = "name"
private const val TEACHER = "teacher"
private const val ROOM = "room"
private const val TIME = "time"
}
override fun onCreate(db: SQLiteDatabase?) {
val createTable = "CREATE TABLE $TABLE_NAME ($ID INTEGER PRIMARY KEY AUTOINCREMENT, $NAME TEXT, $TEACHER TEXT, $ROOM TEXT, $TIME TEXT)"
db?.execSQL(createTable)
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
val dropTable = "DROP TABLE IF EXISTS $TABLE_NAME"
db?.execSQL(dropTable)
onCreate(db)
}
fun addCourse(course: Course): Long {
val db = this.writableDatabase
val values = ContentValues()
values.put(NAME, course.name)
values.put(TEACHER, course.teacher)
values.put(ROOM, course.room)
values.put(TIME, course.time)
val result = db.insert(TABLE_NAME, null, values)
db.close()
return result
}
}
```
在上面的代码中,我们定义了一些常量来表示数据库名称、版本号、数据表名称和列名称。`onCreate()` 方法用于在第一次创建数据库时创建数据表。`onUpgrade()` 方法用于更新数据库结构。`addCourse()` 方法用于向数据表中添加课程数据。
接下来,我们需要在 `MainActivity` 中实现向数据库中添加数据的功能。代码如下:
```kotlin
class MainActivity : AppCompatActivity() {
private lateinit var dbHelper: CourseDbHelper
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
dbHelper = CourseDbHelper(this)
val addButton = findViewById<Button>(R.id.add_button)
addButton.setOnClickListener {
val name = findViewById<EditText>(R.id.name_edit_text).text.toString()
val teacher = findViewById<EditText>(R.id.teacher_edit_text).text.toString()
val room = findViewById<EditText>(R.id.room_edit_text).text.toString()
val time = findViewById<EditText>(R.id.time_edit_text).text.toString()
val course = Course(name = name, teacher = teacher, room = room, time = time)
dbHelper.addCourse(course)
Toast.makeText(this, "Course added!", Toast.LENGTH_SHORT).show()
}
}
}
```
在上面的代码中,我们首先获取用户输入的课程信息,然后创建一个 `Course` 对象,最后调用 `addCourse()` 方法向数据库中添加数据。添加完成后,我们弹出一个 Toast 提示用户。
2. 查看课表
接下来,我们需要实现查看课表的功能。我们可以创建一个 `CourseAdapter` 类来将课程数据显示在 RecyclerView 中。代码如下:
```kotlin
class CourseAdapter(private var courses: List<Course>) : RecyclerView.Adapter<CourseAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.course_item, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val course = courses[position]
holder.nameTextView.text = course.name
holder.teacherTextView.text = course.teacher
holder.roomTextView.text = course.room
holder.timeTextView.text = course.time
}
override fun getItemCount(): Int {
return courses.size
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val nameTextView: TextView = itemView.findViewById(R.id.name_text_view)
val teacherTextView: TextView = itemView.findViewById(R.id.teacher_text_view)
val roomTextView: TextView = itemView.findViewById(R.id.room_text_view)
val timeTextView: TextView = itemView.findViewById(R.id.time_text_view)
}
}
```
在上面的代码中,我们定义了一个 `CourseAdapter` 类,它继承自 RecyclerView.Adapter。`onCreateViewHolder()` 方法用于创建 ViewHolder,`onBindViewHolder()` 方法用于绑定数据。`getItemCount()` 方法返回数据项的数量。ViewHolder 中包含了显示课程信息的 TextView。
接下来,我们需要在 `MainActivity` 中实现查看课表的功能。我们可以在 `onCreate()` 方法中通过查询数据库来获取课程数据,然后将数据传递给 `CourseAdapter`。代码如下:
```kotlin
class MainActivity : AppCompatActivity() {
private lateinit var dbHelper: CourseDbHelper
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
dbHelper = CourseDbHelper(this)
val addButton = findViewById<Button>(R.id.add_button)
addButton.setOnClickListener {
// ...
}
val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
val layoutManager = LinearLayoutManager(this)
recyclerView.layoutManager = layoutManager
val courses = dbHelper.getAllCourses()
val adapter = CourseAdapter(courses)
recyclerView.adapter = adapter
}
}
fun CourseDbHelper.getAllCourses(): List<Course> {
val courses = mutableListOf<Course>()
val db = this.readableDatabase
val query = "SELECT * FROM $TABLE_NAME"
val cursor = db.rawQuery(query, null)
if (cursor.moveToFirst()) {
do {
val id = cursor.getInt(cursor.getColumnIndex(ID))
val name = cursor.getString(cursor.getColumnIndex(NAME))
val teacher = cursor.getString(cursor.getColumnIndex(TEACHER))
val room = cursor.getString(cursor.getColumnIndex(ROOM))
val time = cursor.getString(cursor.getColumnIndex(TIME))
val course = Course(id, name, teacher, room, time)
courses.add(course)
} while (cursor.moveToNext())
}
cursor.close()
db.close()
return courses
}
```
在上面的代码中,我们首先创建了一个 RecyclerView,并设置了其布局管理器。然后,我们通过 `getAllCourses()` 方法获取所有课程数据,然后将数据传递给 `CourseAdapter`。`getAllCourses()` 方法通过查询数据库获取所有课程数据,并将数据封装到 `Course` 对象中返回。
3. 修改课表
最后,我们需要实现修改课表的功能。我们可以在 `CourseAdapter` 中添加一个回调函数来处理课程项的点击事件。代码如下:
```kotlin
class CourseAdapter(private var courses: List<Course>, private val onItemClickListener: OnItemClickListener) : RecyclerView.Adapter<CourseAdapter.ViewHolder>() {
interface OnItemClickListener {
fun onItemClick(course: Course)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.course_item, parent, false)
return ViewHolder(view)
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val course = courses[position]
holder.nameTextView.text = course.name
holder.teacherTextView.text = course.teacher
holder.roomTextView.text = course.room
holder.timeTextView.text = course.time
holder.itemView.setOnClickListener {
onItemClickListener.onItemClick(course)
}
}
override fun getItemCount(): Int {
return courses.size
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val nameTextView: TextView = itemView.findViewById(R.id.name_text_view)
val teacherTextView: TextView = itemView.findViewById(R.id.teacher_text_view)
val roomTextView: TextView = itemView.findViewById(R.id.room_text_view)
val timeTextView: TextView = itemView.findViewById(R.id.time_text_view)
}
}
```
在上面的代码中,我们添加了一个 `OnItemClickListener` 接口,用于处理课程项的点击事件。在 `onBindViewHolder()` 方法中,我们为每个课程项设置了一个点击监听器,并在点击时调用 `onItemClickListener` 的 `onItemClick()` 方法。
接下来,我们需要在 `MainActivity` 中实现修改课表的功能。我们可以创建一个 `CourseDialog` 对话框来显示课程信息并允许用户修改。代码如下:
```kotlin
class MainActivity : AppCompatActivity(), CourseAdapter.OnItemClickListener {
private lateinit var dbHelper: CourseDbHelper
private lateinit var adapter: CourseAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
dbHelper = CourseDbHelper(this)
val addButton = findViewById<Button>(R.id.add_button)
addButton.setOnClickListener {
// ...
}
val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
val layoutManager = LinearLayoutManager(this)
recyclerView.layoutManager = layoutManager
val courses = dbHelper.getAllCourses()
adapter = CourseAdapter(courses, this)
recyclerView.adapter = adapter
}
override fun onItemClick(course: Course) {
val dialog = CourseDialog(this)
dialog.setCourse(course)
dialog.setOnSaveClickListener { updatedCourse ->
dbHelper.updateCourse(updatedCourse)
adapter.notifyDataSetChanged()
Toast.makeText(this, "Course updated!", Toast.LENGTH_SHORT).show()
}
dialog.show()
}
}
class CourseDialog(context: Context) : Dialog(context) {
private lateinit var nameEditText: EditText
private lateinit var teacherEditText: EditText
private lateinit var roomEditText: EditText
private lateinit var timeEditText: EditText
private lateinit var saveButton: Button
private var course: Course? = null
private var onSaveClickListener: ((updatedCourse: Course) -> Unit)? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.dialog_course)
setCancelable(true)
setCanceledOnTouchOutside(true)
nameEditText = findViewById(R.id.name_edit_text)
teacherEditText = findViewById(R.id.teacher_edit_text)
roomEditText = findViewById(R.id.room_edit_text)
timeEditText = findViewById(R.id.time_edit_text)
saveButton = findViewById(R.id.save_button)
saveButton.setOnClickListener {
val name = nameEditText.text.toString()
val teacher = teacherEditText.text.toString()
val room = roomEditText.text.toString()
val time = timeEditText.text.toString()
val updatedCourse = Course(course?.id ?: 0, name, teacher, room, time)
onSaveClickListener?.invoke(updatedCourse)
dismiss()
}
}
fun setCourse(course: Course) {
this.course = course
nameEditText.setText(course.name)
teacherEditText.setText(course.teacher)
roomEditText.setText(course.room)
timeEditText.setText(course.time)
}
fun setOnSaveClickListener(listener: (updatedCourse: Course) -> Unit) {
onSaveClickListener = listener
}
}
```
在上面的代码中,我们在 `MainActivity` 中实现了 `OnItemClickListener` 接口,并在 `onItemClick()` 方法中创建了一个 `CourseDialog` 对话框。我们通过 `setCourse()` 方法将选中的课程信息传递给对话框,然后通过 `setOnSaveClickListener()` 方法设置保存按钮的点击监听器。在保存按钮的点击事件中,我们将用户修改后的课程信息封装成 `Course` 对象,然后调用 `updateCourse()` 方法更新数据库中的数据。更新完成后,我们弹出一个 Toast 提示用户。
在 `CourseDbHelper` 中,我们需要添加一个 `updateCourse()` 方法来更新课程数据。代码如下:
```kotlin
fun updateCourse(course: Course): Int {
val db = this.writableDatabase
val values = ContentValues()
values.put(NAME, course.name)
values.put(TEACHER, course.teacher)
values.put(ROOM, course.room)
values.put(TIME, course.time)
val result = db.update(TABLE_NAME, values, "$ID=?", arrayOf(course.id.toString()))
db.close()
return result
}
```
在上面的代码中,我们使用 `update()` 方法来更新数据表中的数据。
至此,我们已经完成了添加、查看和修改课表的功能。当然,你可以根据自己的需求进行扩展。
阅读全文