时隔多日,回温了一下Android SQLite 数据库(第一行代码),对于以前不熟悉的各种方法,对象也有了更多的了解。
Android 为了让我们更方便的管理数据库,专门提供了一个SQLiteQpenHelper帮助类,借助这个类就可以非常简单的对数据库进行创建和升级。
为此我们需要继承这个抽象类,重写onCreate() 和onUpgrade() 然后在这两个方法中实现各自的逻辑。
SQLiteQpenHelper还有两个非常重要的实例方法:getReadableDatabase() 和getWritableDatabase() 。
这两个方法都可以对数据库进行读写操作,不同的地方是,getReadableDatabase() 和getWritableDatabase()当数据库不可写入的时候如(如磁盘空间已满)getWritableDatabase 将会出现异常
要点:
1.数据库文件会放在/data/data/
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
我想有了这个简单的例子,各位对于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
}