Android SQLite 使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lhk147852369/article/details/83307384

时隔多日,回温了一下Android SQLite 数据库(第一行代码),对于以前不熟悉的各种方法,对象也有了更多的了解。

Android 为了让我们更方便的管理数据库,专门提供了一个SQLiteQpenHelper帮助类,借助这个类就可以非常简单的对数据库进行创建和升级。

为此我们需要继承这个抽象类,重写onCreate() 和onUpgrade() 然后在这两个方法中实现各自的逻辑。

SQLiteQpenHelper还有两个非常重要的实例方法:getReadableDatabase() 和getWritableDatabase() 。

这两个方法都可以对数据库进行读写操作,不同的地方是,getReadableDatabase() 和getWritableDatabase()当数据库不可写入的时候如(如磁盘空间已满)getWritableDatabase 将会出现异常

要点:

1.数据库文件会放在/data/data/<package name>/databases/目录下

2.修改版本号 将会删除原有数据 重新创建

3.SQLite 基本类型 Null  integer  real浮点  text   blob   这相当于对其他数据库类型的整合如varchar char 等

一、创建数据库

我在全局声明了2个表,然后在onCreate 中通过 db.execSQL方法执行

然后在升级方法中 删除了这俩个表 是为了防止在升级时 如果数据库中仍然包含了这两个表 将会报错

之后执行 getWritableDatabase() 方法 就可以创建了

package com.dak.administrator.firstcode.storage.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

/**
 * Created by Administrator on 2018/10/16.
 */

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 static final String CREATE_CATEGORY = "create table Category(" +
            "id integer primary key autoincrement," +
            "category_name text," +
            "category_code integer" +
            ")";

    private Context mContext;

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
        db.execSQL(CREATE_CATEGORY);
        Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
    }

    private static final String DROP_BOOK = "drop table if exists Book";
    private static final String DROP_Category = "drop table if exists Category";
    //当把 version 修改后 onUpgrade 将会执行
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(DROP_BOOK);
        db.execSQL(DROP_Category);
        onCreate(db);
    }
}

 二、增删改查

对于其中的方法 我分别写了 用ContentValues 组装的方式和sql 语言

相信各位 可以看清楚 两种方式的比较

选择喜欢哪种方式,就开个人的爱好了。

package com.dak.administrator.firstcode.storage.db;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.dak.administrator.firstcode.R;

public class SqlActivity extends AppCompatActivity {

    private MyDatabaseHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sql);
        //当把 version 修改后 onUpgrade 将会执行
        dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
        Button createDatabase = findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dbHelper.getWritableDatabase();
            }
        });

        Button addData = findViewById(R.id.add_data);
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
//                db.execSQL("insert into Book(name,author,pages,price) values(?,?,?,?)",
//                        new String[]{"The da Dan brown", "Dan brown", "454", "16.93"});
                ContentValues values = new ContentValues();
                //开始组装第一条数据
                values.put("name", "The da Dan brown");
                values.put("author", "Dan brown");
                values.put("pages", 454);
                values.put("price", 16.93);
                db.insert("Book", null, values);
                values.clear();

                //开始组装第二条数据
                values.put("name", "The Lost Symbol");
                values.put("author", "Dan brown");
                values.put("pages", 111);
                values.put("price", 16.93);
                //用于在未指定添加数据的情况下给某些可为空的列自动赋值null
                db.insert("Book", null, values);
                values.clear();

            }
        });

        Button updateData = findViewById(R.id.update_data);
        updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
//                db.execSQL("update Book set price = ? where name= ?", new String[]{"10", "The da Dan brown"});
                ContentValues values = new ContentValues();
                values.put("price", 100);
                db.update("Book", values, "name=?", new String[]{"The da Dan brown"});
            }
        });

        Button deleteData = findViewById(R.id.delete_data);
        deleteData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
//                db.execSQL("delete from Book where pages>?", new String[]{"452"});
                db.delete("Book", "pages>?", new String[]{"452"});
            }
        });

        Button queryData = findViewById(R.id.query_data);
        queryData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();

//                db.rawQuery("select * from Book", null);

                Cursor cursor = db.query("Book", null, null, null, null, null, null);
                if (cursor.moveToFirst()) {
                    do {
                        //便利Cursor对象 去除数据斌打印
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        String author = cursor.getString(cursor.getColumnIndex("author"));
                        int pages = cursor.getInt(cursor.getColumnIndex("pages"));
                        double price = cursor.getDouble(cursor.getColumnIndex("price"));

                    } while (cursor.moveToNext());
                }
                cursor.close();
            }
        });


    }
}

activity_sql.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.dak.administrator.firstcode.storage.db.SqlActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Create database"
        android:id="@+id/create_database"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Add database"
        android:id="@+id/add_data"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Update database"
        android:id="@+id/update_data"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Delete database"
        android:id="@+id/delete_data"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Query database"
        android:id="@+id/query_data"
        />
</LinearLayout>

我想有了这个简单的例子,各位对于SQLite的操作会有进一步提高的。

虽然不难,但是很爽。。。

说实话,为何要写这篇文章,第一是为了加深自己的记忆,毕竟我已经很久没有接触到原生的数据库操作

大多的时候用的是greenDao,litepal ,但是不可避免的时候 ,如果我们接触到了 很老的项目,很有可能在代码里会有这中实现方式,算是打个预防针嘛...

另外 在我一开始去复习的时候 对于sql代码 已经忘记的差不多了

所以有了以下笔记,只是针对于自己的笔记,能看懂的话 送你个大写的 “服”

package com.dak.administrator.firstcode.storage.db;

/**
 * Created by Administrator on 2018/10/12.
 */

public class Nodes {
//    SQL 通配符必须与 LIKE 运算符一起使用。
//    % _ [charlist]  [^charlist]


    //合并 UNION 相当于交集    UNION ALL会列出 所有
//    SELECT column_name(s) FROM table_name1
//    UNION
//    SELECT column_name(s) FROM table_name2

//    SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中。
//    SELECT *  INTO Persons_backup FROM Persons
//    SELECT * INTO Persons IN 'Backup.mdb' FROM Persons

//    INSERT INTO Persons VALUES ('Gates', 'Bill', 'Xuanwumen 10', 'Beijing')
//    UPDATE Person SET FirstName = 'Fred' WHERE LastName = 'Wilson'
//    DELETE FROM Person WHERE LastName = 'Wilson'

//    建库
//    CREATE DATABASE database_name

//    建表
//    CREATE TABLE 语句用于创建数据库中的表。
//    integer(size)
//    int(size)
//    smallint(size)
//    tinyint(size)

//    decimal(size,d)
//    numeric(size,d)
//
//    char(size)
//
//    varchar(size)
//
//    date(yyyymmdd)

//    CREATE TABLE Persons
//            (
//                    Id_P int,
//                    LastName varchar(255),
//    FirstName varchar(255),
//    Address varchar(255),
//    City varchar(255)
//)

//    autoincrement 自增长
//    SQL 约束
//    SNOT NULL
//    UNIQUE            约束唯一标识数据库表中的每条记录。   Id_P int NOT NULL UNIQUE,   http://www.w3school.com.cn/sql/sql_unique.asp
//    PRIMARY KEY       PRIMARY KEY = unique + not null
//    FOREIGN KEY       外键约束            Id_P int NOT NULL CHECK (Id_P>0),
//    CHECK             CHECK 约束用于限制列中的值的范围。
//    DEFAULT              City varchar(255) DEFAULT 'Sandnes'

//CREATE TABLE Orders
//            (
//                    Id_O int NOT NULL PRIMARY KEY,
//                    OrderNo int NOT NULL,
//                    Id_P int FOREIGN KEY REFERENCES Persons(Id_P)
//)


//    Android sqlLite 基本类型
//    Null integer real浮点 text blob
}

猜你喜欢

转载自blog.csdn.net/lhk147852369/article/details/83307384