6.3.1 数据存储与访问之——初见SQLite数据库

香川松子

6.3.1 数据存储与访问之——初见SQLite数据库

分类 Android 基础入门教程

本节引言:


1.基本概念

1)SQLite是什么?为什么要用SQLite?SQLite有什么特点?

PS:对了,Android内置的SQLite是SQLite 3版本的~

2)几个相关的类:


2.使用SQLiteOpenHelper类创建数据库与版本管理

方法解析

代码示例

public class MyDBOpenHelper extends SQLiteOpenHelper {
    public MyDBOpenHelper(Context context, String name, CursorFactory factory,
            int version) {super(context, "my.db", null, 1); }
    @Override
    //数据库第一次创建时被调用
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE person(personid INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(20))");
        
    }
    //软件版本号发生改变时调用
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("ALTER TABLE person ADD phone VARCHAR(12) NULL");
    }
}

代码解析

流程小结


3.如何查看我们生成的db文件

当我们调用上面的MyDBOpenhelper的对象的getWritableDatabase()就会在下述目录下创建我们的db 数据库文件:

6.3.1 数据存储与访问之——初见SQLite数据库

我们发现数据库有两个,前者是我们创建的数据库,而后者则是为了能让数据库支持事务而产生的 临时的日志文件!一般的大小是0字节! 而在File Explorer里我们确是打不开文件的,连txt都打不开,何况是.db! 所以下面给大家两条路选:

嗯,接着给大家演示上述两种方法,选自己喜欢的一种就可以了~~


方法1:使用SQLite图形化工具查看db文件

这类软件有很多,笔者用的是SQLite Expert Professional,当然你也可以使用其他工具 又需要的可以下载:SQLiteExpert.zip

把我们的db文件导出到电脑桌面,打开SQLiteExpert,界面如下:

6.3.1 数据存储与访问之——初见SQLite数据库

别问我怎么玩,导入db后自己慢慢玩,用法很简单,不懂百度~


至于方法二,本来是想试试的,后来发现sqlite命令找不到,试了几次就算了, 后面用到在细扣,有兴趣可以找下郭霖的《第一行代码——Android》按着流程图试试! 这里只贴前面的一部分,命令部分自己看书!

方法2:adb shell命令行带你装逼带你飞

1.配置SDK环境变量:

右键我的电脑 ——> 高级系统设置 -> 环境变量 -> 新建系统变量 -> 把SDK的platform-tools路径拷贝下: 比如笔者的:C:\Software\Coding\android-sdks-as\platform-tools

6.3.1 数据存储与访问之——初见SQLite数据库

确定,然后再找到Path的环境变量,编辑,然后在结尾加上:%SDK_HOME%;

6.3.1 数据存储与访问之——初见SQLite数据库

然后打开命令行,输入adb,唰唰唰一堆东西,就说明配置成功了!

——————重点——————: 在执行后续命令行指令之前,针对你的测试的机器可能有几种: 1.原生模拟器:那行,你跳过这里,继续往下 2.Genymotion模拟器:没戏,Genymotion Shell执行不了下述命令 3.真机(已root):那么你打开File Explorer看看data/data/目录下有东西没?没么? 下面提供一个方法,就是先装个RE文件管理器,然后授予RE Root权限,接着来到根目录: 然后长按data目录,会弹出这样的对话框:

6.3.1 数据存储与访问之——初见SQLite数据库6.3.1 数据存储与访问之——初见SQLite数据库6.3.1 数据存储与访问之——初见SQLite数据库

接着等他慢慢修改权限,修改完毕后,我们再次打开DDMS的File Explorer,我们可以看到:

6.3.1 数据存储与访问之——初见SQLite数据库

好的,可以看到data/data里的东西了! ——————————————————————

2.进入adb shell,接着键入下述指令,来到我们app的databases目录下:

6.3.1 数据存储与访问之——初见SQLite数据库

接着依次输入下述指令:

...因为system/bin/sh sqlite3: not found,这个问题,后面Sqlite命令的都用不了, 要看效果图就自行查询郭大侠的书吧~而下面我们还是先导出db文件,然后用图形化的 数据库工具来查看!


4.使用Android提供的API操作SQLite

代码示例

运行效果图

6.3.1 数据存储与访问之——初见SQLite数据库

实现代码

布局过于简单,就四个Button,就不贴了,直接贴MainActivity.java的代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Context mContext;
    private Button btn_insert;
    private Button btn_query;
    private Button btn_update;
    private Button btn_delete;
    private SQLiteDatabase db;
    private MyDBOpenHelper myDBHelper;
    private StringBuilder sb;
    private int i = 1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = MainActivity.this;
        myDBHelper = new MyDBOpenHelper(mContext, "my.db", null, 1);
        bindViews();
    }

    private void bindViews() {
        btn_insert = (Button) findViewById(R.id.btn_insert);
        btn_query = (Button) findViewById(R.id.btn_query);
        btn_update = (Button) findViewById(R.id.btn_update);
        btn_delete = (Button) findViewById(R.id.btn_delete);

        btn_query.setOnClickListener(this);
        btn_insert.setOnClickListener(this);
        btn_update.setOnClickListener(this);
        btn_delete.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        db = myDBHelper.getWritableDatabase();
        switch (v.getId()) {
            case R.id.btn_insert:
                ContentValues values1 = new ContentValues();
                values1.put("name", "呵呵~" + i);
                i++;
                //参数依次是:表名,强行插入null值得数据列的列名,一行记录的数据
                db.insert("person", null, values1);
                Toast.makeText(mContext, "插入完毕~", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_query:
                sb = new StringBuilder();
                //参数依次是:表名,列名,where约束条件,where中占位符提供具体的值,指定group by的列,进一步约束
                //指定查询结果的排序方式
                Cursor cursor = db.query("person", null, null, null, null, null, null);
                if (cursor.moveToFirst()) {
                    do {
                        int pid = cursor.getInt(cursor.getColumnIndex("personid"));
                        String name = cursor.getString(cursor.getColumnIndex("name"));
                        sb.append("id:" + pid + ":" + name + "\n");
                    } while (cursor.moveToNext());
                }
                cursor.close();
                Toast.makeText(mContext, sb.toString(), Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_update:
                ContentValues values2 = new ContentValues();
                values2.put("name", "嘻嘻~");
                //参数依次是表名,修改后的值,where条件,以及约束,如果不指定三四两个参数,会更改所有行
                db.update("person", values2, "name = ?", new String[]{"呵呵~2"});
                break;
            case R.id.btn_delete:
                //参数依次是表名,以及where条件与约束
                db.delete("person", "personid = ?", new String[]{"3"});
                break;
        }
    }
}

5.使用SQL语句操作数据库

使用代码示例:

1.插入数据:

public void save(Person p)
{
    SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
    db.execSQL("INSERT INTO person(name,phone) values(?,?)",
                new String[]{p.getName(),p.getPhone()});
}

2.删除数据:

public void delete(Integer id)
{
    SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
    db.execSQL("DELETE FROM person WHERE personid = ?",
                new String[]{id});
}

3.修改数据:

public void update(Person p)
{
    SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
    db.execSQL("UPDATE person SET name = ?,phone = ? WHERE personid = ?",
        new String[]{p.getName(),p.getPhone(),p.getId()});
}

4.查询数据:

public Person find(Integer id)
{
    SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
    Cursor cursor =  db.rawQuery("SELECT * FROM person WHERE personid = ?",
            new String[]{id.toString()});
    //存在数据才返回true
    if(cursor.moveToFirst())
    {
        int personid = cursor.getInt(cursor.getColumnIndex("personid"));
        String name = cursor.getString(cursor.getColumnIndex("name"));
        String phone = cursor.getString(cursor.getColumnIndex("phone"));
        return new Person(personid,name,phone);
    }
    cursor.close();
    return null;
}

5.数据分页:

public List<Person> getScrollData(int offset,int maxResult)
{
    List<Person> person = new ArrayList<Person>();
    SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
    Cursor cursor =  db.rawQuery("SELECT * FROM person ORDER BY personid ASC LIMIT= ?,?",
        new String[]{String.valueOf(offset),String.valueOf(maxResult)});
    while(cursor.moveToNext())
    {
        int personid = cursor.getInt(cursor.getColumnIndex("personid"));
        String name = cursor.getString(cursor.getColumnIndex("name"));
        String phone = cursor.getString(cursor.getColumnIndex("phone"));
        person.add(new Person(personid,name,phone)) ;
    }
    cursor.close();
    return person;
}

6.查询记录数:

public long getCount()
{
    SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
    Cursor cursor =  db.rawQuery("SELECT COUNT (*) FROM person",null);
    cursor.moveToFirst();
    long result = cursor.getLong(0);
    cursor.close();
    return result;      
}   

PS:除了上面获取条数的方法外还可以使用cursor.getCount()方法获得数据的条数, 但是SQL语句要改改!比如SELECT * FROM person;


本节小结:

版权声明:本页面内容旨在传播知识,为用户自行发布,若有侵权等问题请及时与本网联系,我们将第一时间处理。E-mail:284563525@qq.com

目录[+]

取消
微信二维码
微信二维码
支付宝二维码