Android之SQLite数据库

转载 2019-11-14 08:19

SQLite数据库

创建数据库

  1. MyOpenHelper.java这个类必须继承SQLiteOpenHelper这个类

    1
    2
    3
    public class MyopenHelper extends SQLiteOpenHelper {

    }
  2. 添加三个为实现的方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public MyopenHelper(Context context) {
    // (上下文,数据库的名字(null表示在内存中创建存储),游标工厂(系统默认传null),数据库版本号)
    super(context,"SQLite", null, 1);

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
    //当数据库第一次被创建的时候会调用这个方法
    //用于表结构的创建和数据的初始化操作,甚至操作SOLite数据库
    //SQLite都是数据库,都是String类型的
    db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
    System.out.println("SQLite被调用!");

    }
  3. 在MainActivity中去创建MyopenHelper类对象,去调用getReadableDatabase();

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    MyopenHelper myopenHelper = new MyopenHelper(this);
    // 创建或打开一个数据库,获得的都是可读可写的数据库
    // 返回的是一个SQLLIteDatabase
    // getReadableDatabase()在磁盘满返回一个只读数据库
    SQLiteDatabase database =myopenHelper.getReadableDatabase();
    }
    }

    数据库升级

    数据库升降级其实就是表结构的变化

  4. 当数据升级的时候MyopenHelper中的onUpgrade()会被调用,也就是当数据库的版本号发生变化的时候。
    作用:

  • 表结构的修改(增加字段)
  • 添加新的表格
    参数:
  • db:通过它我们就能去执行SQL语句
  • oldVersion:旧的版本号
  • newVersion:新的版本号
    1
    2
    3
    4
    5
    6
    7

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    //添加新的字段
    db.execSQL("alter table info add age integer");

    }
  1. 数据库降级
    当数据库降级的时候会走一个叫onDowngrade这个方法
    1
    2
    3
    4
    5
    6
    @Override
    public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // 数据库降级
    // 默认是不允许降级的,如果需要需要重写这个onDowngrade
    super.onDowngrade(db, oldVersion, newVersion);
    }

    执行SQL语句操作数据库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    //查询
    public void query(View view) {
    SQLiteDatabase database = myopenHelper.getReadableDatabase();
    String sql ="select * from info ";
    database.rawQuery(sql,null);
    }
    //插入
    public void insert(View view) {
    //执行SQL语句要先获得SQLitedatabase对象
    SQLiteDatabase database = myopenHelper.getReadableDatabase();
    String sql = "insert into info(name,phone,age) values('张三','1327038647','19')";
    database.execSQL(sql);
    String sql1 = "insert into info(name,phone,age) values('李四','19278086754','20')";
    database.execSQL(sql1);
    database.close();
    }
    //删除
    public void delete(View view) {
    SQLiteDatabase database = myopenHelper.getReadableDatabase();
    // 删除语句
    String sql = "delete from info where name = '李四'";
    database.execSQL(sql);
    database.close();
    }
    //更新
    public void update(View view) {
    SQLiteDatabase database = myopenHelper.getReadableDatabase();
    // 更新语句
    String sql = "update info set phone='139999999'where name='王五';";
    database.execSQL(sql);
    database.close();
    }

    用谷歌封装APL的方式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    // 查询
    public void insert1(View view) {
    // String sql = "insert into info(name,phone,age) values('张三','1327038647','19')";
    SQLiteDatabase database = myopenHelper.getReadableDatabase();
    String nullConlumnHack="name";
    ContentValues values = new ContentValues();
    // values.put("列名","添加的内容")
    values.put("name","赵四");
    values.put("phone","1782002324");
    values.put("age",25);
    long id = database.insert("info",nullConlumnHack,values);
    if (id != -1){
    Toast.makeText(this,"当前插入到"+id+"行",Toast.LENGTH_LONG).show();
    }else{
    Toast.makeText(this,"插入失败!",Toast.LENGTH_LONG).show();
    }
    database.close();
    }

    // 插入
    public void delete1(View view) {
    SQLiteDatabase database = myopenHelper.getReadableDatabase();
    // 表名
    String table = "info";
    // where的条件 注意:不能包含where关键字,=后面的条件用?代替,在这里传1代表删除所有
    String whereClause = "name = ?";
    // 具体满足条件的值来替换"?"
    String[] whereArgs = {"李四"};
    int id = database.delete(table,whereClause,whereArgs);
    if (id !=-1){
    Toast.makeText(this,"第"+id+"删除成功!",Toast.LENGTH_LONG).show();
    }else{
    Toast.makeText(this,"删除失败!",Toast.LENGTH_LONG).show();
    }
    }

    // 删除
    public void update1(View view) {
    SQLiteDatabase database =myopenHelper.getReadableDatabase();
    ContentValues values = new ContentValues();
    values.put("phone",110);
    // 返回值是究竟更新了几行
    int update = database.update("info", values, "name = ?", new String[]{"张三"});
    database.close();

    }

    // 更新
    public void query1(View view) {
    SQLiteDatabase database =myopenHelper.getReadableDatabase();
    Cursor info = database.query("info", new String[]{"name", "phone"}, "name = ?", null, null, null, null);
    }

    两种方法的区别:

    方法 有没有返回值 操作大量数据的效率 SQL是否灵活 SQL写错率
    execsql,rawqurey 只有查询有 效率高 任意写 概率高
    封装好的api 全都有 效率低 提供出来API 概率低

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×