Android 原生 SQLite 数据库的 Java 使用教程
版本升级:在 onUpgrade 方法中,可以通过删除旧表并重新创建来处理数据库版本升级。在上述代码中,每个数据库操作都通过 try-catch 块捕获异常,并打印堆栈信息。本教程将介绍如何在 Android 应用中使用原生 SQLite 数据库,并通过一个完善的封装类来进行数据库操作,同时对错误和异常进行处理。通过以上步骤,你可以在 Android 应用中使用原生 SQLite 数据库,并通过封
Android 原生 SQLite 数据库的 Java 使用教程
本教程将介绍如何在 Android 应用中使用原生 SQLite 数据库,并通过一个完善的封装类来进行数据库操作,同时对错误和异常进行处理。
1. 创建 SQLiteOpenHelper 子类
SQLiteOpenHelper 是 Android 提供的辅助类,用于管理数据库的创建和版本升级。
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "myDatabase.db";
private static final int DATABASE_VERSION = 1;
private static final String TABLE_NAME = "users";
private static final String COLUMN_ID = "_id";
private static final String COLUMN_NAME = "name";
private static final String COLUMN_AGE = "age";
private static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_NAME + " TEXT NOT NULL, " +
COLUMN_AGE + " INTEGER NOT NULL)";
public MyDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
try {
db.execSQL(CREATE_TABLE);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
try {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
} catch (Exception e) {
e.printStackTrace();
}
}
}
2. 创建数据库操作类
封装数据库的增删改查操作。
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class MyDatabaseAdapter {
private MyDatabaseHelper dbHelper;
public MyDatabaseAdapter(Context context) {
dbHelper = new MyDatabaseHelper(context);
}
// 插入数据
public long insertUser(String name, int age) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(MyDatabaseHelper.COLUMN_NAME, name);
values.put(MyDatabaseHelper.COLUMN_AGE, age);
try {
return db.insert(MyDatabaseHelper.TABLE_NAME, null, values);
} catch (Exception e) {
e.printStackTrace();
return -1;
} finally {
db.close();
}
}
// 查询所有用户
public Cursor getAllUsers() {
SQLiteDatabase db = dbHelper.getReadableDatabase();
try {
return db.query(MyDatabaseHelper.TABLE_NAME, null, null, null, null, null, null);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// 更新用户
public int updateUser(int id, String name, int age) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(MyDatabaseHelper.COLUMN_NAME, name);
values.put(MyDatabaseHelper.COLUMN_AGE, age);
try {
return db.update(MyDatabaseHelper.TABLE_NAME, values, MyDatabaseHelper.COLUMN_ID + " = ?",
new String[]{String.valueOf(id)});
} catch (Exception e) {
e.printStackTrace();
return -1;
} finally {
db.close();
}
}
// 删除用户
public int deleteUser(int id) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
try {
return db.delete(MyDatabaseHelper.TABLE_NAME, MyDatabaseHelper.COLUMN_ID + " = ?",
new String[]{String.valueOf(id)});
} catch (Exception e) {
e.printStackTrace();
return -1;
} finally {
db.close();
}
}
}
3. 在 Activity 中使用封装类
在 Activity 中调用封装好的数据库操作方法。
import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
private MyDatabaseAdapter dbAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbAdapter = new MyDatabaseAdapter(this);
// 插入数据
dbAdapter.insertUser("Alice", 25);
dbAdapter.insertUser("Bob", 30);
// 查询数据
Cursor cursor = dbAdapter.getAllUsers();
if (cursor != null) {
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex(MyDatabaseHelper.COLUMN_ID));
String name = cursor.getString(cursor.getColumnIndex(MyDatabaseHelper.COLUMN_NAME));
int age = cursor.getInt(cursor.getColumnIndex(MyDatabaseHelper.COLUMN_AGE));
Log.d("Database", "ID: " + id + ", Name: " + name + ", Age: " + age);
}
cursor.close();
}
// 更新数据
dbAdapter.updateUser(1, "Alice", 26);
// 删除数据
dbAdapter.deleteUser(2);
}
}
4. 异常处理
在上述代码中,每个数据库操作都通过 try-catch 块捕获异常,并打印堆栈信息。这样可以确保在发生错误时不会导致应用崩溃,并且可以记录错误信息以便调试。
注意事项
线程安全:SQLite 数据库操作不能在主线程中执行,建议使用 AsyncTask 或其他异步方式。资源释放:在操作完成后,确保关闭 Cursor 和数据库连接。版本升级:在 onUpgrade 方法中,可以通过删除旧表并重新创建来处理数据库版本升级。
动态创建数据表示例
1. 数据库帮助类(SQLiteOpenHelper 子类)
这个类负责数据库的创建和版本升级。我们可以通过动态表名和字段来创建表。
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DynamicDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "DynamicDatabase.db";
private static final int DATABASE_VERSION = 1;
public DynamicDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.d("DynamicDatabaseHelper", "Database created.");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.d("DynamicDatabaseHelper", "Database upgraded.");
}
// 动态创建表的方法
public void createTable(String tableName, String[] columns) {
SQLiteDatabase db = this.getWritableDatabase();
try {
StringBuilder createTableSQL = new StringBuilder("CREATE TABLE IF NOT EXISTS ");
createTableSQL.append(tableName).append(" (");
for (int i = 0; i < columns.length; i++) {
createTableSQL.append(columns[i]);
if (i < columns.length - 1) {
createTableSQL.append(", ");
}
}
createTableSQL.append(");");
db.execSQL(createTableSQL.toString());
Log.d("DynamicDatabaseHelper", "Table created: " + tableName);
} catch (Exception e) {
Log.e("DynamicDatabaseHelper", "Error creating table: " + tableName, e);
} finally {
db.close();
}
}
}
2. 数据库操作类
这个类封装了数据库的增删改查操作,并支持动态表的管理。
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
public class DynamicDatabaseManager {
private DynamicDatabaseHelper dbHelper;
public DynamicDatabaseManager(Context context) {
dbHelper = new DynamicDatabaseHelper(context);
}
// 动态创建表
public void createTable(String tableName, String[] columns) {
dbHelper.createTable(tableName, columns);
}
// 插入数据
public long insert(String tableName, ContentValues values) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
try {
return db.insert(tableName, null, values);
} catch (Exception e) {
Log.e("DynamicDatabaseManager", "Error inserting data into table: " + tableName, e);
return -1;
} finally {
db.close();
}
}
// 查询数据
public Cursor query(String tableName, String[] columns, String selection, String[] selectionArgs, String orderBy) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
try {
return db.query(tableName, columns, selection, selectionArgs, null, null, orderBy);
} catch (Exception e) {
Log.e("DynamicDatabaseManager", "Error querying data from table: " + tableName, e);
return null;
}
}
// 更新数据
public int update(String tableName, ContentValues values, String whereClause, String[] whereArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
try {
return db.update(tableName, values, whereClause, whereArgs);
} catch (Exception e) {
Log.e("DynamicDatabaseManager", "Error updating data in table: " + tableName, e);
return -1;
} finally {
db.close();
}
}
// 删除数据
public int delete(String tableName, String whereClause, String[] whereArgs) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
try {
return db.delete(tableName, whereClause, whereArgs);
} catch (Exception e) {
Log.e("DynamicDatabaseManager", "Error deleting data from table: " + tableName, e);
return -1;
} finally {
db.close();
}
}
// 执行原生 SQL 查询
public Cursor rawQuery(String sql, String[] selectionArgs) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
try {
return db.rawQuery(sql, selectionArgs);
} catch (Exception e) {
Log.e("DynamicDatabaseManager", "Error executing raw query", e);
return null;
}
}
// 关闭数据库
public void close() {
dbHelper.close();
}
}
3. 使用封装类
以下是如何在 Activity 或其他组件中使用封装类的示例。
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
private DynamicDatabaseManager dbManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbManager = new DynamicDatabaseManager(this);
// 动态创建表
String tableName = "users";
String[] columns = {"_id INTEGER PRIMARY KEY AUTOINCREMENT", "name TEXT NOT NULL", "age INTEGER"};
dbManager.createTable(tableName, columns);
// 插入数据
ContentValues values = new ContentValues();
values.put("name", "Alice");
values.put("age", 25);
long insertId = dbManager.insert(tableName, values);
Log.d("MainActivity", "Inserted ID: " + insertId);
// 查询数据
Cursor cursor = dbManager.query(tableName, new String[]{"_id", "name", "age"}, null, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
Log.d("MainActivity", "ID: " + id + ", Name: " + name + ", Age: " + age);
}
cursor.close();
}
// 更新数据
ContentValues updateValues = new ContentValues();
updateValues.put("age", 26);
int updateRows = dbManager.update(tableName, updateValues, "_id = ?", new String[]{"1"});
Log.d("MainActivity", "Updated Rows: " + updateRows);
// 删除数据
int deleteRows = dbManager.delete(tableName, "_id = ?", new String[]{"1"});
Log.d("MainActivity", "Deleted Rows: " + deleteRows);
// 关闭数据库
dbManager.close();
}
}
通过以上步骤,你可以在 Android 应用中使用原生 SQLite 数据库,并通过封装类来进行数据库操作,确保代码的可维护性和可读性。
更多推荐




所有评论(0)