之前我发布了一篇安卓之LitePal,链接: https://blog.csdn.net/jzdcuccess/article/details/106026445.这是我观看郭霖老师在他编写的《第一行代码》中学习到的,LitePal是对于数据库不懂的同志可以学习,而接下来我所讲述的是对于数据库理解的童鞋们所能理解的。
首先我们要理解数据库存储
Android系统中集成了一个轻量级数据库–SQLite,他是一款轻量级数据库,它的运行速度非常快,占用资源很少,通常只需要几百KB的内存就足够了,非常适合于移动设备上。
SQLite不仅支持标准的SQL语法,还遵循数据库的ACID事务,所以只要你以前使用过数据库就很快上手。
对SQLite已经基本讲完了,接下来讲述的是很重要的。
SQLiteOpenHelper
在Android中,提供了一个数据库辅助类,那就是SQLiteOpenHelper。
SQLiteOpenHelper是一个抽象类,这就意味着我们如果想使用它的话就必须创建一个类去继承它。SQLiteOpenHelper中有两个抽象方法,分别是onCreate()和onUpgrade(),我们需要从这两个抽象方法中创建和更新数据库。
话不多说我们上案例,首先需要创建一个安卓项目:
先编写一个类继承自SQLiteOpenHelper(我编写的类是DBOpenHelper):
public class DBOpenHelper extends SQLiteOpenHelper {
private Context context1;
public DBOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
context1=context;
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建数据库
db.execSQL("create table book(" +
"id integer primary key autoincrement," +
"author text," +
"price real," +
"page integer," +
"name text)");
Toast.makeText(context1,"数据库已创建完成!",Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//升级数据库
}
}
在创建onCreate()方法中我们是执行创建一个名为book的表。
在这里我讲解下:
integer: 表示整形
real:表示浮点型
text:表示文本类型
blob:表示二进制类型
primary key:主键
autoincrement:表示自动增长
在xml中编写如下代码:
```javascript
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="数据库的创建与使用"
android:textSize="20sp"
android:gravity="center"
/>
<Button
android:layout_width="match_parent"
android:layout_height="15dp"
/>
<Button
android:id="@+id/create"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="创建数据库"
/>
<Button
android:id="@+id/insert"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加"
/>
<Button
android:id="@+id/update"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="更新"
/>
<Button
android:id="@+id/delete"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除"
/>
<Button
android:id="@+id/select"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查看"
/>
``` 主要是创建几个按钮用来实现数据库的增删改查。 (效果图) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200512224419970.png) 在java中编写如下代码:
public class MainActivity extends AppCompatActivity {
private DBOpenHelper dbOpenHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dbOpenHelper=new DBOpenHelper(this,"Book.db",null,1);//第一个参数是Conext,第二个是数据库名,第三个直接就是null,第四个是数据库版本号
Button create=(Button)findViewById(R.id.create);
create.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dbOpenHelper.getWritableDatabase();//getWritableDatabase()在这里的意思是创建数据库
}
});
Button insert=(Button)findViewById(R.id.insert);
insert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db=dbOpenHelper.getWritableDatabase();//打开数据库
//下面是插入第一条数据
ContentValues values=new ContentValues();// ContentValues提供了一系列的put()方法,用于向 ContentValues中添加数据
//只需要将表中的每个列名以及对应的列值放入
values.put("author","林徽因");
values.put("price",25.59);
values.put("page",300);
values.put("name","你是人间四月天");
db.insert("book",null,values);
values.clear();//把values中的数据先清除
//这是插入第二条数据
values.put("author","大冰");
values.put("price",39.9);
values.put("page",500);
values.put("name","小孩");
db.insert("book",null,values);
}
});
Button update=(Button)findViewById(R.id.update);
update.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db=dbOpenHelper.getWritableDatabase();//打开数据库
ContentValues values=new ContentValues();
values.put("price",36.9);
db.update("book",values,"name=?",new String[]{"小孩"});
}
});
Button delete=(Button)findViewById(R.id.delete);
delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db=dbOpenHelper.getWritableDatabase();//打开数据库
db.delete("book","page>?",new String[]{"500"});
}
});
Button select=(Button)findViewById(R.id.select);
select.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SQLiteDatabase db=dbOpenHelper.getWritableDatabase();//打开数据库
Cursor cursor=db.query("book",null,null,null,null,null,null,null);
if (cursor.moveToFirst()){//用于将指针移动到第一条记录上
while (!cursor.isAfterLast()){//用于判断指针是否指在最后一条记录上
Log.i("Book","查询结果");
Log.i("Book ","作者:"+cursor.getString(1));
Log.i("Book ","价格:"+cursor.getFloat(2));
Log.i("Book ","页数:"+cursor.getInt(3));
Log.i("Book ","书名:"+cursor.getString(4));
cursor.moveToNext();//移动到下一条
}
}
}
});
}
}
在这里我稍微讲述一下getReadableDatabase()和getWritableDatabase()这两个方法(主要我是参考郭霖老师的讲解,不要见怪吆):
这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库)斌返回一个可对数据库进行读写操作的对象,不同的是,当数据库不可写入的时候(如磁盘空间已满),getReadableDatabase()方法返回的对象将以读的方式去打开数据,而getWritableDatabase()方法则出现异常。
最后在讲述一下Cursor对象:
Cursor就是游标,它是SQL的一个内存工作区,由系统或用户以变量的形式定义,游标的作用就是用于临时存储从数据库中提取的数据块。存在SQL语句的结果。
下面是效果图:如下所示
首先点击创建数据库这个按钮,因为数据库表中没有数据所以需要添加数据,在点击添加按钮,然后点击查看按钮,你就可以看到你期待的。
这就是最后的结果,好了这就是使用数据库的一个简单案例。