你想知道的SQLite数据库存储

前言:

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

下面介绍一下SQLiteOpenHelper:(扩展知识)

SQLiteOpenHelper类介绍

  • 定义:SQLiteOpenHelper是一个辅助类
  • 作用:管理数据库(创建、增、修、删) & 版本的控制。
  • 使用过程:通过创建子类继承SQLiteOpenHelper类,实现它的一些方法来对数据库进行操作。 在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。
  • SQLiteOpenHelper类的数据库操作方法介绍
方法名 作用 备注
onCreate() 创建数据库 创建数据库时自动调用
onUpgrade() 升级数据库
close() 关闭所有打开的数据库对象
execSQL() 可进行增删改操作, 不能进行查询操作
query()、rawQuery() 查询数据库
insert() 插入数据
delete() 删除数据
getWritableDatabase() 创建或打开可以读/写的数据库 通过返回的SQLiteDatabase对象对数据库进行操作
getReadableDatabase() 创建或打开可读的数据库 同上

简单总结上面的:

我们知道:

SQLiteOpenHelper 是一个抽象类,abstract class.

拥有成员变量,mName(数据库名称),mNewVersion(数据库版本),mDatabase(数据库)等.

构造函数需要传递,context,数据库名称,数据库版本等信息.

SQLiteOpenHelper(Context context, String name, CursorFactory factory,int version)

实现了以下函数:

getDatabaseName

getWritableDatabase

getReadableDatabase

onDowngrade

close

subclass需要实现以下函数

public abstract void onCreate(SQLiteDatabase db);

public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion);

​        它是一个抽象类,意味着我们要使用它就需要创建一个自己的类去继承它,两个抽象方法:onCreate()和onUpgrade(),需要重写,实现创建、升级数据库的逻辑。

实例方法:getReadableDatabase()和getWritableDatabase(),如果存在打开,不存在时创建,当磁盘满了,上一个以只读方式打开,writable出现异常。

构造方法:参数:Context,daba_name,Cursor,version

存在位置:/data/data//databases/目录下。


1.创建数据库

我们用AS创建一个DatabaseTest项目,先来熟悉建表的相关语句:

建表语句:

create table Book{
	id integer primary key autoincrement,//组件,id列自增长
	author text,//文本类型
	price real,//浮点型
	pages integer,//整型
	name text)
}

新建MyDatabaseHelper类继承SQLiteOpenHelper

public class MyDatabaseHelper extends SQLitePenHelper{
	pulic static final String CREATE_BOOK = "create table Book("
		+"id integer primary key autonincreament,"
		+"author text,"
		+"price real,"
		+"pages integer,"
		+"name text)";
	private ContextmContext;
	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);
		Toast.makeText(mContext,"Create succeeded",Toast.LENGTH_SHORT)
		.show();
	}
	@Override
	public void onUpagrade(SQLiteDatabase db,int oldVersion, int newVersion)
	){}
}

用Android Studio创建过程:

首先activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:orientation="vertical" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 > 
 <Button 
 android:id="@+id/create_database" 
 android:layout_width="match_parent" 
 android:layout_height="wrap_content" 
 android:text="Create database" 
 /> 
</LinearLayout>

修改MainActivity

public class MainActivity extends AppCompatActivity { 
 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 View.OnClickListener() { 
 @Override 
 public void onClick(View v) { 
 dbHelper.getWritableDatabase(); 
 } 
 }); 
 } 
 
}

查看:

可以使用命令行来查看信息,翻到文末的资料小卡片了解更多->>>

/data/data/com.example.databasetest/databases/

使用ls查看

两个文件,一个BookStore.db,借助sqlite3+数据库名

查看表:.table

.schema查看建表语句

.exit退出




2.升级数据库

如果想添加一张Catagory表用于记录图书的分类

首先:建表语句如下:

create table Category ( 
 id integer primary key autoincrement, 
 category_name text, 
 category_code integer)

添加到MyDatabaseHelper中

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
 db.execSQL("drop table if exists Book"); 
 db.execSQL("drop table if exists Category"); 
 onCreate(db); 
 }

版本升级变为2

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

 } 
}

建表完成之后接下来就是基本操作CRUDCreate,Retrieve,Updata,Delete)




3.添加数据

我们在调用SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()方法,返回了SQLitaDatabase对象,所以我们借助这个对象进行操作。

操作的方法

​ insert()方法(表名,null, ContenValues对象:提供put()方法重载以此添加数据)

建立UI

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

点击事件添加逻辑

Button addData = (Button) findViewById(R.id.add_data); 
 addData.setOnClickListener(new View.OnClickListener() { 
 @Override 
 public void onClick(View v) { 
 SQLiteDatabase db = dbHelper.getWritableDatabase(); 
 ContentValues values = new ContentValues(); 
 // 开始组装第一条数据
 values.put("name", "The Da Vinci Code"); 
 values.put("author", "Dan Brown"); 
 values.put("pages", 454); 
 values.put("price", 16.96); 
 db.insert("Book", null, values); // 插入第一条数据
 values.clear(); 
 // 开始组装第二条数据
 values.put("name", "The Lost Symbol"); 
 values.put("author", "Dan Brown"); 
 values.put("pages", 510); 
 values.put("price", 19.95); 
 db.insert("Book", null, values); // 插入第二条数据
 } 
 });


4.更新数据

​ update()方法(表名,ContenValues对象,第三,第四约束更新的数据,不指定就是默认更新所有行)

UI

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

逻辑

Button updateData = (Button) findViewById(R.id.update_data); 
 updateData.setOnClickListener(new View.OnClickListener() { 
 @Override 
 public void onClick(View v) { 
 SQLiteDatabase db = dbHelper.getWritableDatabase(); 
 ContentValues values = new ContentValues(); 
 values.put("price", 10.99);
 db.update("Book", values, "name = ?", new String[] { "The Da Vinci 
 Code" }); 
 } 
 });




5.删除数据

​ delete()方法(表名,第二第三约束删除某一行或某几行)

UI

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

逻辑

deleteButton.setOnClickListener(new View.OnClickListener() { 
 @Override 
 public void onClick(View v) { 
 SQLiteDatabase db = dbHelper.getWritableDatabase(); 
 db.delete("Book", "pages > ?", new String[] { "500" }); 
 } 
 });




6.查询数据

query()方法(表名,指定查询那几列,第三第四约束查询某一行或者某几行,第五指定需要取group by的列,不指定则表示不操作,第六对group by进一步的操作,第七指定查询结果的排序方式)

UI

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

逻辑

Button queryButton = (Button) findViewById(R.id.query_data); 
 queryButton.setOnClickListener(new View.OnClickListener() { 
 @Override 
 public void onClick(View v) { 
 SQLiteDatabase db = dbHelper.getWritableDatabase(); 
 // 查询 Book 表中所有的数据
 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")); 
 Log.d("MainActivity", "book name is " + name); 
 Log.d("MainActivity", "book author is " + author); 
 Log.d("MainActivity", "book pages is " + pages); 
 Log.d("MainActivity", "book price is " + price); 
 } while (cursor.moveToNext()); 
 } 
 cursor.close(); 
 } 
 });




7.展示图片:

在这里插入图片描述



8.当然也可以使用SQL或者LitePal操作数据库

例如使用SQL

 添加数据的方法如下:
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)", 
 new String[] { "The Da Vinci Code", "Dan Brown", "454", "16.96" }); 
db.execSQL("insert into Book (name, author, pages, price) values(?, ?, ?, ?)", 
 new String[] { "The Lost Symbol", "Dan Brown", "510", "19.95" }); 
 更新数据的方法如下:
db.execSQL("update Book set price = ? where name = ?", new String[] { "10.99", 
"The Da Vinci Code" }); 
 删除数据的方法如下:
db.execSQL("delete from Book where pages > ?", new String[] { "500" }); 
 查询数据的方法如下:
db.rawQuery("select * from Book", null);




资料:

在命令行操作使用SQL语句操作SQLite数据库

1)adb shell 进入

2)在终端输入“sqlite3”进入命令行操作界面
sqlite>
sqlite>

3)常用的sqlite3命令
.help
.exit/.quit 退出

ctrl+L//清屏

2 常用SQL语句
2.1 创建数据库
语法:
sqlite3 testDB.db
创建名字为testDB.db数据库文件,然后进入sqlite命令行界面
sqlite> .databases //查看当前操作数据库的信息

2.2 创建表(Table)
语法:
CREATE TABLE table_name(
column1 datatype [PRIMARY KEY],
column2 datatype ,
…);
注:不区分大小写,习惯关键字用大写
PRIMARY KEY:主键,表示该类数据不能重复,可以加快数据库的访问,一张表中只有一列可以声明为主键。
eg:创建company表:ID、姓名、年龄、地址、薪资
sqlite> CREATE TABLE company(
…> id INT PRIMARY KEY,
…> name TEXT,
…> age INT,
…> address TEXT,
…> salary REAL NOT NULL);
.tables :查看当前数据库中存在数据表
.schema:查看数据表的完整信息

2.3删除表
语法:
DROP TABLE table_name;

2.4向数据表中插入数据
语法:
INSERT INTO table_name
(column1,column2,column3,…)
VALUES(value1,value2,value3,…)
eg:
sqlite> INSERT INTO company
…> (id,name,salary)
…> VALUES(10086,“张飞”,12000);
sqlite> SELECT * FROM company; //查询表中全部数据

2.5从数据表删除一条数据
语法:
DELETE FROM table_name WHERE [condition];

参考资料:《第一行代码》《Android权威编程指南》

发布了123 篇原创文章 · 获赞 234 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43919400/article/details/105208713