SQLiteDatabases使用

SQLite是android提供的内置的一个轻量级别的数据库。使用SQLite的应用程序都有一个该数据库的实例,一般情况下数据储存在androidSD卡的 /data/data/<packagename>/databases 文件夹中。

使用SQLite的步骤:

创建数据库

打开数据库

创建表

完成数据库的(增删改查)

关闭数据库

下面都是根据谷歌封装好的方法来进行的表的增删改查

使用谷歌封装好的方法操作数据库的利弊:

利: 1.写法简单,不需要写复杂的SQL语句,也就不容易出错

        2.有返回值,方便开发者进行开发

弊:不容易进行多表查询

使用SQL语句操作数据库的利弊:

利:容易多表查询

弊:1.SQL语句容易写错

       2.执行SQL语句没有返回值,不容易进行判断

1. 继承SQLiteOpenHelper
public MySqliteOpenHelper(Context context) {
super(context, DB_NAME, null, VERTION);
//创建了一个数据库
}
@Override
public void onCreate(SQLiteDatabase db) {
//在onCreate中创建我们所有的表
db.execSQL(CRETAE_TABLE_USER);
}

@Override
13. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVer
sion) {
14. //数据库版本更新的时候
15. //删除旧的表,建立新的表
16. }
17.
18. 2. 获取数据库
19. MySqliteOpenHelper helper = new MySqliteOpenHelper(this);
20. //helper.getWritableDatabase() //当磁盘满了,就会报错
21. //helper.getReadableDatabase() //当磁盘满了,不进行操作了
22.
23. 3. 增删查改
24. //成功返回插入的id号,失败返回-1
25. db.insert(TABLE_NAME, null, contentValues(键值对来保存数据库的键名=值));
26. //成功返回受影响的行数,失败返回-1
27. db.update(TABLE_NAME, 修改的数据contentValues, "条件 使用?来占位", new Str
ing[]{对应?占位符});
28. db.query(TABLE_NAME, null, null, null, null, null, null);//全部查询
29. //选择性查询
30. db.query(TABLE_NAME, new String[]{查询的列}, "条件?", new String[]{对应?
}, null, null, null);
31.
32. //成功返回受影响的行数,失败返回-1
33. db.delete(TABLE_NAME,"条件",new String[]{对应?};
34.
35.
36.
37. 查询语句返回的是Cursor
38.
39. while(cursor.moveToNext()) //遍历所有的数据


SQLiteOpenHelper是android提供给我们的一个数据库辅助类(抽象的)用来创建和打开数据库的。我们要自己写一个类来继承它。在该类的构造器中,调用Context中的方法创建并打开一个指定名称的数据库对象。继承和扩展SQLiteOpenHelper类主要做的工作就是重写以下两个方法。

1. onCreate(SQLiteDatabase db) :当数据库被首次创建时执行该方法,一般将创建表等初始化操作在该方法中执行。
2. onUpgrade(SQLiteDatabse dv, int oldVersion,int new Version):当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。

除了上述两个必须要实现的方法外,还可以选择性地实现onOpen 方法,该方法会在每次打开数据库时被调用。

SQLiteOpenHelper 类的基本用法是:当需要创建或打开一个数据库并获得数据库对象时,首先根据指定的文件名创建一个辅助对象,然后调用该对象的getWritableDatabase 或
getReadableDatabase方法 获得SQLiteDatabase 对象。

调用getReadableDatabase 方法返回的并不总是只读数据库对象,一般来说该方法和getWriteableDatabase 方法的返回情况相同,只有在数据库仅开放只读权限或磁盘已满时才会返回一个只读的数据库对象。一般都会用getReadableDatabase


关于 Cursor

在你理解和使用 Android Cursor 的时候你必须先知道关于 Cursor 的几件事情:

Cursor 是每行的集合。
使用 moveToFirst() 定位第一行。
你必须知道每一列的名称。
你必须知道每一列的数据类型。

Cursor 是一个随机的数据源。
所有的数据都是通过下标取得


关于 Cursor 的重要方法:

方法: close()
解释: 关闭游标,释放资源

方法: copyStringToBuffer(int columnIndex,CharArrayBufferbuffer)
解释: 在缓冲区中检索请求的列的文本,将将其存储

方法: getColumnCount()
解释: 返回所有列的总数

方法: getColumnIndex(StringcolumnName)
解释: 返回指定列的名称,如果不存在返回-1

方法: getColumnIndexOrThrow(StringcolumnName)
解释: 从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException异常。

方法: getColumnName(int columnIndex)
解释: 从给定的索引返回列名

方法: getColumnNames()
解释: 返回一个字符串数组的列名

方法: getCount()
解释: 返回Cursor 中的行数

方法: moveToFirst()
解释: 移动光标到第一行

方法: moveToLast()
解释: 移动光标到最后一行

方法: moveToNext()
解释: 移动光标到下一行

方法: moveToPosition(int position)
解释: 移动光标到一个绝对的位置

方法: moveToPrevious()
解释: 移动光标到上一行


例子:

package com.example.lesson_sqlitedatabase;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MySqliteOpenHelper helper = new MySqliteOpenHelper(this);
/*        helper.getWritableDatabase()  当磁盘满了,就会报错
        helper.getReadableDatabase() 当磁盘满了,不进行操作了,这两个方法都可以读写,所以一般都会用这个方法*/
        // 打开数据库,去创建
        SQLiteDatabase sqld = helper.getReadableDatabase();
        // 传值到user对象
        User user = new User("张三", "123456789");
        ContentValues values = new ContentValues();
        // 添加到数据库(键值对)
        values.put(MySqliteOpenHelper.USERNAME, user.getUsername());
        values.put(MySqliteOpenHelper.PASSWORD, user.getPassword());
        // 存储数据
        sqld.insert(MySqliteOpenHelper.TABLE_NAME, null, values);

        // 修改数据
        ContentValues values1 = new ContentValues();
        // 键值
        values1.put("username", "李四");
        values1.put("password", "987654321");
        // 修改后更新数据
        sqld.update(MySqliteOpenHelper.TABLE_NAME, values1, "ID=? and username=?", new String[]{"2", "张三"});

        // 查询
        Cursor cursor = sqld.query(MySqliteOpenHelper.TABLE_NAME, null, null, null, null, null, null);
        List<User> userList = new ArrayList<>();
        // 有数据就会进入while循环取读取数据,没有就会断开不进入
        while (cursor.moveToNext()) {
            long id = cursor.getLong(cursor.getColumnIndex(MySqliteOpenHelper.ID));
            String username = cursor.getString(cursor.getColumnIndex(MySqliteOpenHelper.USERNAME));
            String password = cursor.getString(cursor.getColumnIndex(MySqliteOpenHelper.PASSWORD));
            User u = new User(username, password);
            u.setId(id);
            // 把所有的数据添加到userList中
            userList.add(u);
        }
        cursor.close();
        Log.e("TAG", "------------------" + userList.toString());
        Collections.sort(userList, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                return o1.getUsername().compareTo(o2.getUsername());
            }
        });

        // 删除
        sqld.delete(MySqliteOpenHelper.TABLE_NAME, "username=?", new String[]{"张三"});
    }
}
package com.example.lesson_sqlitedatabase;

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

/**
 * Created by Administrator on 2017/3/29 0029.
 */

public class MySqliteOpenHelper extends SQLiteOpenHelper {
    // 数据库的名称
    public static final String DB_NAME = "user.db";
    public static final int VERSION = 1;

    //表名
    public static final String TABLE_NAME = "user";

    //列名
    public static final String ID = "ID";
    public static final String USERNAME = "username";
    public static final String PASSWORD = "password";

    // CREATE_TABLE_USER 后面的是创建表的输入语句
    public static final String CREATE_TABLE_USER =  "create table " + TABLE_NAME + " (" + ID + " integer primary key autoincrement," + USERNAME + " varchar(20) not null," + PASSWORD + " varchar(20) not null)";

    public MySqliteOpenHelper(Context context) {
        super(context, DB_NAME, null, VERSION);
        // 创建一个数据库
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建表都是到onCreate中创建
        db.execSQL(CREATE_TABLE_USER);
    }


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // 数据库版本更新的时候
        // 删除旧的表,建立新的表
    }
}

package com.example.lesson_sqlitedatabase;

/**
 * Created by Administrator on 2017/3/29 0029.
 */

public class User {
    long id;
    String username;
    String password;

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章