安卓开发中常用的轻型数据库是SQLite。以下是一个简单的使用SQLite进行数据库操作的案例代码:
创建数据库和数据表
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "mydatabase.db";
private static final int DB_VERSION = 1;
private static final String TABLE_NAME = "mytable";
private static final String COLUMN_ID = "id";
private static final String COLUMN_NAME = "name";
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE " + TABLE_NAME + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_NAME + " TEXT NOT NULL);";
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
数据库操作方法
public class MyDB {
private SQLiteDatabase database;
private DBHelper dbHelper;
public MyDB(Context context) {
dbHelper = new DBHelper(context);
}
public void open() throws SQLException {
database = dbHelper.getWritableDatabase();
}
public void close() {
dbHelper.close();
}
public void insertData(String name) {
ContentValues values = new ContentValues();
values.put(DBHelper.COLUMN_NAME, name);
database.insert(DBHelper.TABLE_NAME, null, values);
}
public Cursor getAllData() {
String[] columns = {DBHelper.COLUMN_ID, DBHelper.COLUMN_NAME};
Cursor cursor = database.query(DBHelper.TABLE_NAME, columns, null, null, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
}
return cursor;
}
public int updateData(long id, String name) {
ContentValues values = new ContentValues();
values.put(DBHelper.COLUMN_NAME, name);
int update = database.update(DBHelper.TABLE_NAME, values, DBHelper.COLUMN_ID + " = " + id, null);
return update;
}
public int deleteData(long id) {
int delete = database.delete(DBHelper.TABLE_NAME, DBHelper.COLUMN_ID + " = " + id, null);
return delete;
}
}
使用数据库操作方法
MyDB db = new MyDB(this);
db.open();
// 插入数据
db.insertData("John");
// 查询数据
Cursor cursor = db.getAllData();
if (cursor != null && cursor.moveToFirst()) {
do {
long id = cursor.getLong(cursor.getColumnIndex(DBHelper.COLUMN_ID));
String name = cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_NAME));
Log.d("MyDB", "ID: " + id + ", NAME: " + name);
} while (cursor.moveToNext());
}
// 更新数据
db.updateData(1, "Mike");
// 删除数据
db.deleteData(2);
db.close();
示例的完整代码
public class MainActivity extends AppCompatActivity {
private EditText etName;
private Button btnInsert, btnQuery, btnUpdate, btnDelete;
private ListView listView;
private ArrayAdapter<String> adapter;
private ArrayList<String> dataList = new ArrayList<>();
private MyDB db;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etName = findViewById(R.id.et_name);
btnInsert = findViewById(R.id.btn_insert);
btnQuery = findViewById(R.id.btn_query);
btnUpdate = findViewById(R.id.btn_update);
btnDelete = findViewById(R.id.btn_delete);
listView = findViewById(R.id.list_view);
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dataList);
listView.setAdapter(adapter);
db = new MyDB(this);
db.open();
btnInsert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = etName.getText().toString();
db.insertData(name);
showMessage("Data inserted successfully");
etName.setText("");
refreshData();
}
});
btnQuery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
refreshData();
}
});
btnUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String name = etName.getText().toString();
long id = listView.getSelectedItemId();
int rowsUpdated = db.updateData(id, name);
showMessage(rowsUpdated + " rows updated");
refreshData();
}
});
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
long id = listView.getSelectedItemId();
int rowsDeleted = db.deleteData(id);
showMessage(rowsDeleted + " rows deleted");
refreshData();
}
});
}
private void refreshData() {
dataList.clear();
Cursor cursor = db.getAllData();
if (cursor != null && cursor.moveToFirst()) {
do {
long id = cursor.getLong(cursor.getColumnIndex(DBHelper.COLUMN_ID));
String name = cursor.getString(cursor.getColumnIndex(DBHelper.COLUMN_NAME));
dataList.add(id + ": " + name);
} while (cursor.moveToNext());
}
adapter.notifyDataSetChanged();
}
private void showMessage(String message) {
Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
}
@Override
protected void onDestroy() {
super.onDestroy();
db.close();
}
}
在这个示例中,我们实现了对SQLite数据库的基本操作,包括插入、查询、更新和删除数据。我们还使用了ListView来展示查询到的数据,并提供了EditText和按钮来进行数据的插入、更新和删除操作。
异常处理
在使用SQLite进行数据库操作时,可能会出现异常,例如数据库版本不匹配、数据表不存在等等。在这些情况下,我们应该及时捕获异常并进行相应的处理,以避免应用程序崩溃。
以下是一个简单的异常处理示例代码:
public void insertData(String name) {
try {
ContentValues values = new ContentValues();
values.put(DBHelper.COLUMN_NAME, name);
database.insert(DBHelper.TABLE_NAME, null, values);
} catch (SQLException e) {
e.printStackTrace();
}
}
在这个示例中,我们使用了try-catch语句捕获了SQLException异常,并打印了异常堆栈信息。在应用程序实际运行过程中,我们可以使用更加详细和友好的方式来提示用户出现异常,例如使用Toast或AlertDialog等。
数据库升级
在实际开发中,我们可能需要对数据库结构进行升级,例如添加新的数据表、添加新的列等等。在SQLite中,我们可以通过在DBHelper类中重写onUpgrade()方法来实现数据库升级。
以下是一个升级数据库的示例代码:
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "mydatabase.db";
private static final int DB_VERSION = 2;
private static final String TABLE_NAME = "mytable";
private static final String COLUMN_ID = "id";
private static final String COLUMN_NAME = "name";
private static final String COLUMN_AGE = "age";
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE " + TABLE_NAME + " (" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_NAME + " TEXT NOT NULL);";
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (oldVersion < 2) {
db.execSQL("ALTER TABLE " + TABLE_NAME + " ADD COLUMN " + COLUMN_AGE + " INTEGER DEFAULT 0;");
}
}
}
在这个示例中,我们将数据库版本号DB_VERSION从1升级到了2,并在onUpgrade()方法中添加了一个ALTER TABLE语句,用于在原有数据表中添加一个新的列COLUM_AGE。
当应用程序从旧版本升级到新版本时,系统会自动调用onUpgrade()方法进行数据库结构更新。我们在onUpgrade()方法中判断旧版本号oldVersion,如果是1,则执行ALTER TABLE语句添加新的列。
总结
本文介绍了Android中的SQLite数据库的基本用法,包括创建数据库、创建数据表、增删改查数据以及异常处理和数据库升级。通过这些基本操作,我们可以为应用程序提供一个轻量级、快速、可靠的本地数据存储方案。
需要注意的是,在实际开发中,我们需要根据实际情况来设计和组织数据库结构,例如数据表和列的命名方式、数据类型的选择、一对多和多对多关系的建立等等。同时,我们也需要进行数据操作的安全处理,例如数据的加密、防止SQL注入等等。
最后,我们也可以使用ORM框架(例如GreenDao、ORMLite)来简化数据库操作,并提高代码的可读性和维护性。