Sqlite数据库,增删改查,升级和事物

1. Sqlite数据库

SQLite 是一款内置到移动设备上的轻量型的数据库,是遵守ACID(原子性、一致性、隔离性、持久性)的关联式数据库管理系统,多用于嵌入式系统中。SQLite 数据库是无类型的,可以向一个integer 的列中添加一个字符串,但它又支持常见的类型比如:NULLVARCHAR, TEXT, INTEGER, BLOB, CLOB 等。

Android 系统内置了SQLite,并提供了一系列API 方便对其进行操作。

使用SQLiteOpenHelper 创建数据库

SQLiteOpenHelper Android 提供的一个抽象工具类,负责管理数据库的创建、升级工作。如果我们想创建数据库,就需要自定义一个类继承SQLiteOpenHelper,然后覆写其中的抽象方法。代码如下:

/**

 * 定义一个我们自己的数据库创建的帮助类

 */

public class MyDataBaseOpenHelper extends SQLiteOpenHelper {

/**

 * @param context

 *            上下文

 * @param test

 *            .db 数据库文件的名称

 * @param null 默认游标工厂 从数据库文件的头部开始的

 * @param 1 version 数据库的版本号 最小是1

 */

public MyDataBaseOpenHelper(Context context) {

super(context, "test.db", null, 2);

}

/**

 * 当数据库第一次被创建的时候调用的方法.这个方法只会执行一次, 一般在这个方法里面初始化数据的表结构.

 */

@Override

public void onCreate(SQLiteDatabase db) {

System.out.println("数据库 oncreate");

db.execSQL("create table student (_id integer primary key autoincrement, name varchar(20), phone varchar(30))");

}

 

/**

 * 当数据库需要被更新的时候调用的方法 数据库只能升级不能降级

 * @param oldVersion

 *            旧的数据库的版本

 * @param newVersion

 *            新的数据库的版本

 */

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

System.out.println("数据库要被更新了,onupgrade");

// db.execSQL("alter table student add account varchar(20)");

}

}

注意:

上面的代码我们只是定义了一个MySQLiteOpenHelper 类继承了SQLiteOpenHelper 类。在onCreate() 方法中通过执行sql 语句实现表的创建。onUpgrade()方法只有在数据库版本发生变化的情况下才会执行。

如果只是创建出来该类并不会真正的去创建数据库而是需要通过执行helper.getWritableDatabase()或者hepler.getReadableDatabase()

public class MainActivity extends Activity {

    @Override

     protected void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);

          setContentView(R.layout.activity_main);

         //这一句代码执行完毕数据库是不会被创建的.

         MyDataBaseOpenHelper helper = new MyDataBaseOpenHelper(this);

         //下面这一行代码执行了 数据库才会被创建

         helper.getWritableDatabase();

    }

}

上面的代码如果第一次执行,则会创建一个数据库文件,创建的数据库文件位于/data/data/包名/databases/目录中。如果数据库已经创建,则只是打开数据库而不会再去创建。



数据库的增删改查

刚才创建了MySQLiteOpenHelper 类,通过该类可以获取SQLiteDatabase 对象。而SQLiteDatabase对象则可实现对数据库的增删改查操作。

使用纯SQL语句实现

(db.execSQL(sql,Object[]{}))

sql-->insert into tableName(columnName1,columnName2,...) values (?,?,...)

(db.execSQL(sql,Object[]{}))

sql-->delete from tableName where columnName=?

(db.execSQL(sql,Object[]{}))

sql-->update tableName set columnName1 = ? where columnName2 = ?

(db.rawQuery(sql,Object[]{}))

sql-->select * from tableName where columnName = ?

表中增加列 (db.execSQL(sql))

sql-->alter table tableName columnName type

 

注意:

使用纯SQL 语句操作适合SQL 比较熟练的程序员。如果SQL 掌握的不好,没关系,Android 提供了一套API 可以帮助我们完成以上操作。

使用Android下的API实现增删改查

ContentValues values = new ContentValues();

values.put(columnName, value);

db.insert(tableName,null,values);   

//第一个参数表名; 第二个参数:如果ContentValues 为空,那么默认情况下是不允许插入空值的,但是如果给该参数设置了一个指定的列 名,那么就允许ContentValues 为空,同时给该列插入null 值。第三个参数:要插入的数据

//第一个参数:表名;第二个参数:删除条件;第三个参数:用于替换第二个参数的?;  返回值:删除成功的个数

db.delete(tableName, "name=?", new String[]{value});

ContentValues values = new ContentValues();

values.put(columnName, value

db.update(tableName, values, "name=?", new String[] { value });

Cursor cursor = db.query(tableName, 需要查询的列, "name=?", new String[]{value},null,null, 排序);

 

注意:

1. contentValues该类底层是Map数据结构   values.put(key,values): key 对应数据库表中字段  value是想插入的值

2. tableName 是表名不是数据库名

3.使用db进行增删改查的时候注意用完进行db.close()释放资源

4.cursor对象是数据库查询完毕后封装的一个结果集,可以通过moveToNext判断是否还有下一个可获取的值,通过cursor.getString(index)获取对 应的值

这里的index对应的是查询的时候查询的哪一列0对应columName11对应columNmae2……


两种SQLiteDatabase的不同

SQLiteOpenHelper 有两个方法均可返回SQLiteDatabase 对象:

1.getWritableDatabase()

该方法返回的对象和另外一个方法返回的对象没有任何差异,返回的对象对数据库都可以进行读、写操作,当磁盘已满或者权限不足 的情况下该方法会抛出异常。

2.getReadableDatabase()

跟另外一个方法相比,在磁盘已满的情况下,该方法不会抛出异常,而是返回一个只读的数据库操作对象。根据这两种方法返回对象 的差异,如果需要对数据库进行查询操作则推荐使用后者,如果添加、修改、删除数据则推荐使用前者。




数据库的升级和事务

1. 数据库的升级

在创建MySQLiteOpenHelper 对象的时候需要传递一个int 类型的version 参数,代表数据库的版本号,数值从1 开始。如果在new MySQLiteOpenHelper 对象的时候传 递的version 大于先去创建的version,那就会导致系统回调onUpgrade 方法,从而实现了数据库的升级。

2. 数据库的事物

SQLiteDatabase 提供了对事务的支持,处于事务中的操作都是“临时性”的,只有事务提交了才会将数据保存到数据库。事务的使用不仅可以保证数据的一致性,也可以提高批处理时的执行效率。SQLiteDatabase 提供的beginTransaction()打开事务,endTransaction()结束事务。注意:结束事务并不代表事务提交,如果想让数据写入数据库需要在结束事务前执行setTransactionSuccessful()方法。这是事务提交的唯一方式。

如下代码模拟转账的过程中出现异常如果开启了事务那么整个转账过程都不会执行成功

BankDBOpenHelper helper = new BankDBOpenHelper(this);

SQLiteDatabase db = helper.getWritableDatabase();

db.beginTransaction(); // 开启事务

try {

// 模拟转账的操作

db.execSQL("update account set money=money-100 where name='zhangsan'");

s.equals("haha");

db.execSQL("update account set money=money+100 where name='lisi'");

db.setTransactionSuccessful();// 设置事务执行成功

} finally {

db.endTransaction();//还可以回滚代码

}

db.close();



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLite数据库增删改查操作可以通过调用SQLiteOpenHelper类中的getReadableDatabase()或getWritableDatabase()方法来实现。这两个方法不仅可以用于创建和升级数据库,还会返回一个SQLiteDatabase对象,通过这个对象可以进行CRUD操作。 添加数据可以使用SQLiteDatabase的insert()方法,该方法接收三个参数,第一个参数是表名,第二个参数是要插入的数据,第三个参数是用于约束插入数据的条件。 删除数据可以使用SQLiteDatabase的delete()方法,该方法也接收三个参数,第一个参数是表名,第二个参数是用于约束删除某一行或某几行的条件,第三个参数是用于传入条件值。如果不指定约束条件,则默认删除所有行。 修改数据可以使用SQLiteDatabase的update()方法,该方法也接收三个参数,第一个参数是表名,第二个参数是要更新的数据,第三个参数是用于约束更新某一行或某几行的条件。 查询数据可以使用SQLiteDatabase的query()方法,该方法参数较多,最简单的方法重载需要传入七个参数,包括表名、要查询的名、约束条件等。通过该方法可以获取满足条件的数据。 通过以上方法,可以实现SQLite数据库增删改查操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SQLite数据库增删改查](https://blog.csdn.net/Massimo__JAVA/article/details/125237970)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值