android 数据库详解

本文介绍了在Android开发中使用SQLite数据库的方法,包括使用xUtils框架和继承SQLiteOpenHelper两种实现方式,详细展示了创建数据库、表的操作,以及增删改查等基本功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在android中一般使用SQLite,SQLite是一种轻量级数据库,其有独立性、跨平台、安全性特征,是一种实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。

SQLite俩种实现方式:

1.使用xUtils框架
首先要导入xutils jar包,配置下相应权限。

基础描述

需要的权限
<uses-permissionAndroid:name="android.permission.INTERNET"/>
    <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

创建数据库
  DaoConfig config = new DaoConfig(context);
  config.setDbName("xUtils-demo"); //db名
  config.setDbVersion(1);  //db版本
  DbUtils db = DbUtils.create(config);//db还有其他的一些构造方法,比如含有更新表版本的监听器的

创建表
  db.createTableIfNotExist(User.class); //创建一个表User
    db.save(user);//在表中保存一个user对象。最初执行保存动作时,也会创建User表

删除表
  db.dropTable(User.class); 

开启事务
  db.configAllowTransaction(true);

public class SQLiteHelper {

private DbUtils mDB = null;
//代码中所用key在实际开发中,根据自己需求逻辑调整
private synchronized void _init() {
    mDB = DbUtils.create(context, path, name);//创建数据库
    mDB.configAllowTransaction(true);
    Key key = new Key(); //Key对象必须有id属性,或者有通过@ID注解的属性
    key.setId("1");
    key.setName("xxx");
    try {
        mDB.save(key);// mDB.saveBindingId(key);使用saveBindingId保存实体时会为实体的id赋值
    } catch (DbException e) {
        e.printStackTrace();
    }

}
//更新数据库
public void updateKeys(List<Key> keys) {
    ArrayList<String> keyIds = new ArrayList<>();
    if (keys == null) {
        keys = new ArrayList<>();
    }
    for (Key key : keys) {
        WhereBuilder builder = WhereBuilder.b().and("keyId", "==", key.getId());
        long count = 0;
        try {
            Selector selector = Selector.from(Key.class).where(builder);
            if (mDB != null) {
                count = mDB.count(selector);
            }
        } catch (DbException e) {
            e.printStackTrace();
        }

        if (count == 0) {
            addKey(key);
        } else {
            try {
                mDB.update(key, builder, "name", "type");
            } catch (DbException e) {
                e.printStackTrace();
            }
        }

        keyIds.add(key.getId());
    }
}

//更新key信息
public void updateKey(Key key) {
    try {
        mDB.saveOrUpdate(key);
    } catch (DbException e) {
        e.printStackTrace();
    }
}

//新增key
public synchronized void addKey(Key key) {
    try {
        mDB.saveBindingId(key);
    } catch (DbException e) {
        e.printStackTrace();
    }

}

//删除
public synchronized void deleteKey(String id) {
    WhereBuilder builder = WhereBuilder.b().and("id", "==", id);
    try {
        mDB.delete(Key.class, builder);
    } catch (DbException e) {
        e.printStackTrace();
    }
}

}

2.继承SQLiteOpenHelper
public class SQLiteHelper extends SQLiteOpenHelper {

private final static String USER_ID = "user_id";
private final static String USER_NAME = "user_name";
private final static String TABLE_NAME = "table_name";

public SQLiteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
    super(context, name, factory, version);
}

//创建数据库,在此做初始化操作
@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table if not exists" +TABLE_NAME+"("
            + "id integer primary key,"
            + USER_NAME+" varchar,"
            + "level integer)");
}

//当打开数据库时传入的版本号与当前的版本号不同时会调用该方法
@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
    String sql="DROP TABLE IF EXISTS "+TABLE_NAME;
    db.execSQL(sql);
    onCreate(db);
}

//查询条件
public Cursor select() {
    SQLiteDatabase db=this.getReadableDatabase();
    Cursor cursor=db.query(TABLE_NAME,null,null,null,null,null,"_id desc");
    return cursor;
}


//增加条件,返回插入行的id,错误返回-1
public long insert(String name) {
    SQLiteDatabase db=this.getWritableDatabase();
    ContentValues cv=new ContentValues();
    cv.put(USER_NAME, name);
    long row=db.insert(TABLE_NAME, null, cv);
    return row;
}


//状态返回,若传入正确的where语句 则被删除的行数将被返回 若传入null 返回0 若要删除所有行并返回删除的行数 则需要在where语句的地方传入字符串
//删除条件,whereValue取代where中的?占位符
public void delete(int id){
    SQLiteDatabase db=this.getWritableDatabase();
    String where=USER_ID+"=?";
    String[] whereValue={Integer.toString(id)};
    db.delete(TABLE_NAME, where, whereValue);
}

//更新数据库
public void update(int id,String name){
    SQLiteDatabase db=this.getWritableDatabase();
    String where=USER_NAME+"=?";
    String[] whereValue={Integer.toString(id)};
    ContentValues cv=new ContentValues();
    cv.put(USER_NAME, name);
    db.update(TABLE_NAME, cv, where, whereValue);
}

}

### Android 平台上的数据库使用与原理 #### SQLite 数据库基础 SQLite 是一种轻量级的关系型数据库管理系统,在 Android 中广泛应用于本地数据存储。`android.database.sqlite` 包提供了访问和管理 SQLite 数据库的功能[^1]。 #### SQLiteOpenHelper 类的作用 为了简化开发者的工作流程,Android 提供了 `SQLiteOpenHelper` 这一辅助类。此类不仅能够处理数据库的创建与版本控制,还能够在应用程序生命周期内有效地管理数据库连接资源[^2]。 ```java public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "mydatabase.db"; private static final int DATABASE_VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建新表结构 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 处理数据库升级逻辑 } } ``` #### GreenDAO 的应用 GreenDAO 是一款高效的 ORM 库,允许开发人员利用 Java 注解定义实体类及其属性映射关系。借助这些注解,可以轻松实现复杂的数据持久化需求,比如设定主键、配置字段约束条件等特性[^3]。 #### 常见问题及解决方案 当遇到跨组件通信或事务一致性方面的问题时,务必仔细检查代码中的异常捕获机制以及确保所有必要的回调函数都得到了妥善处理。例如,如果发现某些情况下记录未能成功写入,则可能是由于未正确处理并发冲突所致[^4]。 #### 安全性考量——SQLCipher 加密技术 对于涉及敏感信息的应用程序而言,采用 SQLCipher 对整个 SQLite 数据库文件实施加密是非常重要的安全措施之一。该方法已被多个知名社交软件采纳,并证明其可靠性和兼容性强[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值