本教程将介绍如何在 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 数据库,并通过封装类来进行数据库操作,确保代码的可维护性和可读性。

Logo

一站式 AI 云服务平台

更多推荐