Android学习记录:SQLite数据库、res中raw的文件调用

SQLite数据库是一种轻量级的关系型数据库。
在android中保存数据或调用数据库可以利用SQLite。
android中提供了几个类来管理SQLite数据库

SQLiteDatabass类用来对数据库进行管理。
这里写图片描述
若是第一次运行时Create 以后直接访问的话,可以用openOrCreateDatabase方法来访问\创建数据库。
如果是访问本地已经创建的库的话,可以利用OpenDatabase方法。
这里写图片描述
查询数据库信息提供了一下几种方法
前几种query方法是带入参数,自动转换为sql语句。
后面的rawquery是自己输入sql语句。
这里写图片描述
这里写图片描述

还有一种SQLiteOpenHelper类
其中getReadableDatabase()/getWritableDatabase()方法与OpenOrCreate类似。
OnCreate可以用于第一次创建数据库加入初始数据。
这里写图片描述

android方面的SQLite方法介绍到这。

本地访问SQLite可以通过SQLite3(命令行操作)或SQLite Database Browser(可视化操作)。
这里写图片描述
SQLite3
这里写图片描述
SQLite Database Browser

这里拿test.db作为示例数据库
其中table test中的数据如下
这里写图片描述

下面来介绍如何调用本地数据库
安卓res/raw目录用于存放通用的文件,该文件夹内的文件将不会被编译成二进制文件,按原样复制到设备上。可以用来保存数据库。(没有raw目录直接在res下面new一个raw)
将我们刚才的test.db复制到res/raw下面(R文件会自动生成其位置)

我们在安卓上读取数据库,可以先将raw下面的数据库复制到本地再来读取。所以要存放在本地数据,需要在AndroidManifest中加入

android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

android.permission.WRITE_EXTERNAL_STORAGE: Allows wrtiting files for external storage.
android.permission.MOUNT_UNMOUNT_FILESYSTEMS: Allows mounting and unmounting file systems for removable storage.

然后 我们就需要获取SQLiteDatabase对象了
我们建立getsqlitedatabase类用于获取SQLiteDatabase对象
首先第一次打开软件,我们需要把我们的数据库从raw中转存到本地。

public class getsqldatabase {
    private Context context;
    private String sdpath = android.os.Environment.getExternalStorageDirectory().getAbsolutePath()+"/mydatabase";//sdpath用于存放保存的路径。
    private String filename = "test.db";//filename用于保存文件名。


    public getsqldatabase(Context context) {
        this.context = context;
    }

    public SQLiteDatabase opensqlDatabase() {
        File dir = new File(sdpath);
        if (!dir.exists()) {
            dir.mkdir();
        }//如果该目录不存在,创建该目录
        String databasefilename = sdpath+"/"+filename;//其值等于database的路径
        File filepath = new File(databasefilename);
        if (!filepath.exists()) {//如果文件不存在
            try {
                InputStream inputStream = context.getResources().openRawResource(R.raw.test);//将raw中的test.db放入输入流中
                FileOutputStream fileOutputStream = new FileOutputStream(databasefilename);//将新的文件放入输出流中
                byte[] buff = new byte[8192];   
                int len = 0;
                while ((len = inputStream.read(buff)) > 0) {
                    fileOutputStream.write(buff, 0, len);
                }
                fileOutputStream.close();
                inputStream.close();
            } catch (Exception e) {
                Log.i("info","无法复制");
                e.printStackTrace();
            }
        }//写入文件结束
        Log.i("filepath"," "+filepath);
        SQLiteDatabase database = SQLiteDatabase.openDatabase(filepath.getPath(),null,SQLiteDatabase.OPEN_READWRITE);//利用openDatabase方法打开数据库。
        return database;
    }
}

gettext方法用于从表中获取数据
其中Cursor 是每行的集合。使用 moveToFirst() 定位第一行。你必须知道每一列的名称。你必须知道每一列的数据类型。Cursor 是一个随机的数据源。所有的数据都是通过下标取得。

关于 Cursor 的重要方法:

·close():关闭游标,释放资源 ·getColumnCount():返回所有列的总数 ·getColumnIndex(String
columnName):返回指定列的名称,如果不存在返回-1 ·getColumnIndexOrThrow(String
columnName):从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。
·getColumnName(int columnIndex):从给定的索引返回列名
·getColumnNames():返回一个字符串数组的列名 ·getCount():返回Cursor 中的行数
·moveToFirst():移动光标到第一行 ·moveToLast():移动光标到最后一行 ·moveToNext():移动光标到下一行
·moveToPosition(int position):移动光标到一个绝对的位置 ·moveToPrevious():移动光标到上一行

public class gettext {

    private Context context;

    public gettext(Context context) {
        // TODO Auto-generated constructor stub
        this.context = context;
    }

    public void getquestionMap(String[] args)  {
        getsqldatabase getsql = new getsqldatabase(context);
        SQLiteDatabase database = getsql.opensqlDatabase();//获取SQLiteDatabase对象
        Cursor cursor = database.rawQuery("select * from test where id=?", args);//利用rawQuery方法查库 前面一个参数是sql语句,后面的是条件
        int colums = cursor.getColumnCount();//获取列数(该行有多少数据)
        while (cursor.moveToNext()) {
            for (int i = 0; i < colums; i++) {
                String columname = cursor.getColumnName(i);//获取每列的列名
                String columvalue = cursor.getString(cursor.getColumnIndex(columname));//获取每列的值
                if (columvalue == null) {
                    columvalue = "";
                }
                Log.i("infor",columvalue);
            }
        }
        if (database != null) {
            database.close();
        }
    }
}

测试语句

    gettext get = new gettext(this);
    get.getquestionMap(new String[]{"1"});

转载于:https://www.cnblogs.com/he11o-liu/p/7503262.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值