4.15日报
完成移动应用开发实验四:
实验四:SQLite和SQLiteDatabase应用
一、实验目的
1、本次实验的目的是让大家熟悉Android中对数据库进行操作的相关的接口、类等。SQLiteDatabase这个是在android中数据库操作使用最频繁的一个类。通过它可以实现数据库的创建或打开、创建表、插入数据、删除数据、查询数据、修改数据等操作。
2、实现添加用户名,爱好小例程。
二、实验要求
1、完成Android开发平台的搭建及相关配置
2、创建项目并熟悉文件目录结构
3、实现例程添加用户名,爱好实验步骤
三、实验步骤
3. 实现例程添加用户名和爱好的实验步骤
我们将创建一个简单的应用,包含以下功能:
- 用户输入用户名和爱好。
- 将数据保存到SQLite数据库。
- 查询并显示所有用户数据。
3.1 创建数据库帮助类(DBHelper.java)
创建一个DBHelper类,继承自SQLiteOpenHelper,用于创建和管理数据库。
package com.example.sqliteexample;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "user.db";
private static final int DB_VERSION = 1;
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// 创建用户表
String createUserTable = "CREATE TABLE users (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"username TEXT, " +
"hobby TEXT)";
db.execSQL(createUserTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 删除旧表并重新创建
db.execSQL("DROP TABLE IF EXISTS users");
onCreate(db);
}
}
3.2 创建MainActivity布局文件
在res/layout/activity_main.xml中编写布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
android:gravity="center_horizontal">
<EditText
android:id="@+id/et_username"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="用户名"
android:inputType="text"
android:layout_marginBottom="16dp" />
<EditText
android:id="@+id/et_hobby"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="爱好"
android:inputType="text"
android:layout_marginBottom="16dp" />
<Button
android:id="@+id/btn_save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存"
android:layout_marginBottom="16dp" />
<Button
android:id="@+id/btn_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查看所有用户"
android:layout_marginBottom="16dp" />
</LinearLayout>
3.3 编写MainActivity逻辑代码
在MainActivity.java中编写逻辑代码:
package com.example.sqliteexample;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private EditText etUsername;
private EditText etHobby;
private Button btnSave;
private Button btnView;
private DBHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etUsername = findViewById(R.id.et_username);
etHobby = findViewById(R.id.et_hobby);
btnSave = findViewById(R.id.btn_save);
btnView = findViewById(R.id.btn_view);
dbHelper = new DBHelper(this);
btnSave.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveUser();
}
});
btnView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewUsers();
}
});
}
private void saveUser() {
String username = etUsername.getText().toString();
String hobby = etHobby.getText().toString();
if ("".equals(username) || "".equals(hobby)) {
Toast.makeText(MainActivity.this, "用户名和爱好不能为空", Toast.LENGTH_SHORT).show();
return;
}
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("username", username);
values.put("hobby", hobby);
db.insert("users", null, values);
db.close();
Toast.makeText(MainActivity.this, "用户保存成功", Toast.LENGTH_SHORT).show();
}
private void viewUsers() {
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = db.query("users", new String[]{"id", "username", "hobby"}, null, null, null, null, null);
StringBuilder sb = new StringBuilder();
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("id"));
String username = cursor.getString(cursor.getColumnIndex("username"));
String hobby = cursor.getString(cursor.getColumnIndex("hobby"));
sb.append("ID: ").append(id).append(", 用户名: ").append(username).append(", 爱好: ").append(hobby).append("\n");
}
cursor.close();
db.close();
if (sb.toString().isEmpty()) {
Toast.makeText(MainActivity.this, "没有用户数据", Toast.LENGTH_SHORT).show();
} else {
Intent intent = new Intent(MainActivity.this, ViewUsersActivity.class);
intent.putExtra("users", sb.toString());
startActivity(intent);
}
}
}
3.4 创建ViewUsersActivity
- 创建布局文件: 在res/layout/activity_view_users.xml中编写布局代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp"
android:gravity="center_horizontal">
<TextView
android:id="@+id/tv_users"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用户数据"
android:textSize="18sp"
android:layout_marginBottom="16dp" />
</LinearLayout>
编写逻辑代码: 在ViewUsersActivity.java中编写逻辑代码:
package com.example.sqliteexample;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
public class ViewUsersActivity extends AppCompatActivity {
private TextView tvUsers;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_users);
tvUsers = findViewById(R.id.tv_users);
String users = getIntent().getStringExtra("users");
if (users != null) {
tvUsers.setText(users);
} else {
tvUsers.setText("没有用户数据");
}
}
}
3.5 配置AndroidManifest.xml
确保在AndroidManifest.xml中注册了两个Activity:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.SQLiteExample">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ViewUsersActivity" />
</application>