zoukankan      html  css  js  c++  java
  • 数据持久化之sqlite基本用法

    一、ACID

    即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

    原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。

    一致性:事务在完成时,必须使所有的数据都保持一致状态。

    隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。有时也称串行化。

    持久性:在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

    二、SQLiteOpenHelper

    SQLiteOpenHelper 是一个抽象类,SQLiteOpenHelper 中有两个抽象方法,分别是onCreate()和 onUpgrade(),我们必须在自己的帮助类里面重写这两个方法;SQLiteOpenHelper 中还有两个非常重要的实例方法,getReadableDatabase() 和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。

    1、创建数据库

    首先,新建自己的帮助类,执行建表语句

    public class MyDatabaseHelper extends SQLiteOpenHelper {
    public static final String CREATE_BOOK = "create table book ("
    + "id integer primary key autoincrement, "
    + "author text, "
    + "price real, "
    + "pages integer, "
    + "name text)";
    private Context mContext;
    public MyDatabaseHelper(Context context, String name, CursorFactory
    factory, int version) {
    super(context, name, factory, version);
    mContext = context;
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_BOOK);
    Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
    }
    

    在activity中,新建MyDatabaseHelper对象,调用getWritableDatabase()方法

    public class MainActivity extends Activity {
    private MyDatabaseHelper dbHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
    Button createDatabase = (Button) findViewById(R.id.create_database);
    createDatabase.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    dbHelper.getWritableDatabase();
    }
    });
    }
    }
    

    想查看表结构可以用sqlite explore查看。

    2.基本操作

    新建一个SQLiteDatabase对象获取dbhelper新建或找到的实例,sqlite提供了很多用于增删改查的方法,但是我觉得还是直接用execSQL方法和rawQuery方法直接用sql语句进行操作比较好。

    String nameString=text1.getText().toString();
    String priceString=text2.getText().toString();
    String numberString=text3.getText().toString();
    SQLiteDatabase db=dbhelper.getWritableDatabase();
    String insertSql="insert into good(name,price,number)values(?,?,?)";
    db.execSQL(insertSql,new String[]{nameString,priceString,numberString});//这里最好用占位符,因为是从edittext中获取的信息,在一条查询语句中无法识别这些变量
    

    db.execSQL("delete from Book where pages > ?", new String[] { "500" });
    

    db.execSQL("update Book set price = ? where name = ?", new String[] { "10.99",
    "The Da Vinci Code" });

    dbhelper=new MyDatabaseHelper(this,"Store.db", null, 1);
    		SQLiteDatabase db=dbhelper.getWritableDatabase();
    	//	Cursor cursor=db.query("good",new String[]{"_id","name","price","number"}, null, null,null, null, "name");//两种方式
    		Cursor cursor=db.rawQuery("select * from good where number>3",null);
    

    三、使用事务

    SQLiteDatabase db = dbHelper.getWritableDatabase();
    db.beginTransaction(); // 开启事务
    try {
    db.delete("Book", null, null);
    if (true) {
    // 在这里手动抛出一个异常,让事务失败
    throw new NullPointerException();
    }
    ContentValues values = new ContentValues();
    values.put("name", "Game of Thrones");
    values.put("author", "George Martin");
    values.put("pages", 720);
    values.put("price", 20.85);
    db.insert("Book", null, values);
    db.setTransactionSuccessful(); // 事务已经执行成功
    } catch (Exception e) {
    e.printStackTrace();
    } finally {
    db.endTransaction(); // 结束事务
    }
    

     beginTransaction是开启事务,setTransactionSuccessful是让事务成功,endbeginTransaction结束事务,因为事务中间出现异常,所以添加操作不会执行,而且删除操作也不会执行。



  • 相关阅读:
    Python定时任务利器—Apscheduler
    Python命令行模块(sys.argv,argparse,click)
    Rust安装和环境配置
    DBF 文件 ORACLE 数据库恢复
    认识 Cargo-Rust构建工具和包管理器
    VS Code 搭建 Rust 开发环境
    如何按名称或PID查找一个进程?如何按端口号查找一个进程?如何查看一个进程的CPU和内存、文件句柄使用情况?如何查看CPU利用率高的TOP10进程清单?如何根据PID强制终止进程?
    String 字符串
    JVM初探之类文件结构
    隐藏Windows不常用设置项
  • 原文地址:https://www.cnblogs.com/librasun/p/5590880.html
Copyright © 2011-2022 走看看