安卓之数据库

之前我发布了一篇安卓之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语句的结果。
下面是效果图:如下所示
在这里插入图片描述
首先点击创建数据库这个按钮,因为数据库表中没有数据所以需要添加数据,在点击添加按钮,然后点击查看按钮,你就可以看到你期待的。
在这里插入图片描述

这就是最后的结果,好了这就是使用数据库的一个简单案例。

原创文章 16 获赞 18 访问量 5073

猜你喜欢

转载自blog.csdn.net/jzdcuccess/article/details/106086628