Android 中 导入已存在的 sqlite数据库时出现的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/WangRain1/article/details/53506147

1》刚开始时我导入sqlite数据库放在了asserts下面,我按照网上的例子最后发现是我的“包名”出了问题,我现在用Android studio 以前用的时eclipse  ,所以习惯性的我就应用了mainfaset下面的包名了,所以不管我怎么读取sqlite文件总是打不开数据库。。。。。。。包名要到grid里面去拿,下面是创建数据库的代码。。

package com.yzkj.utils.twicedb;

import android.content.Context;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2016/12/7.
 */

public class DataBaseHelper {

    //数据库存储路径
    String filePath = "data/data/yzkj.com.android_zdzy/herbsinfo.db";
    //数据库存放的文件夹 data/data/com.main.jh 下面
    String pathStr = "data/data/yzkj.com.android_zdzy";

    SQLiteDatabase database;

    public SQLiteDatabase openDatabase(Context context) {
        System.out.println("filePath:" + filePath);
        File jhPath = new File(filePath);
        //查看数据库文件是否存在
        if (jhPath.exists()) {
            Log.i("test", "存在数据库");
            //存在则直接返回打开的数据库
            return SQLiteDatabase.openOrCreateDatabase(jhPath, null);
        } else {
            //不存在先创建文件夹
            File path = new File(pathStr);
            Log.i("test", "pathStr=" + path);
            try {
                if (!path.exists()){
                    path.mkdir();
                }
            }catch (Exception e){
                Log.e("test", "创建失败"+e);
            }
            try {
                Log.e("test", "444444444444444444444444");
                //得到资源
                AssetManager am = context.getAssets();
                //得到数据库的输入流
                InputStream is = am.open("herbsinfo.db");

                Log.e("33333333333333333", is + "");
                //用输出流写到SDcard上面
                FileOutputStream fos = new FileOutputStream(jhPath);
                Log.e("test", "fos=" + fos);
                Log.e("test", "jhPath=" + jhPath);
                //创建byte数组  用于1KB写一次
                byte[] buffer = new byte[1024];
                int count = 0;
                while ((count = is.read(buffer)) > 0) {
                    Log.e("test", "得到");
                    fos.write(buffer, 0, count);
                }
                //最后关闭就可以了
                fos.flush();
                fos.close();
                is.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            }
            //如果没有这个数据库  我们已经把他写到SD卡上了,然后在执行一次这个方法 就可以返回数据库了
            return openDatabase(context);
        }
    }

//    /**
//     * 查询本地草药
//     * @param sql
//     * @return
//     */
    public List<Herbs> QueCy(String sql,SQLiteDatabase db) {


        List<Herbs> list = new ArrayList<Herbs>();

        Cursor cursor = null;
        try{
            cursor = db.rawQuery(sql,null);
        }catch (Exception e){
            Log.e("-----------","--------------"+e);
        }

        if(cursor.getCount()==0)
        {
            return list;
        }

        if (cursor != null&& cursor.getCount() >= 1 ) {

            cursor.moveToFirst();

            while (!cursor.isAfterLast()) {

                //id
                String herbid = cursor.getString(cursor
                        .getColumnIndex("herbid"));
                //药名
                String cyname = cursor.getString(cursor
                        .getColumnIndex("cyname"));
                //丁香--DX:[11--22]
                String namereamrk = cursor.getString(cursor
                        .getColumnIndex("namereamrk"));
                //要单位
                String dw = cursor.getString(cursor
                        .getColumnIndex("dw"));
                //煎服
                String jf = cursor.getString(cursor
                        .getColumnIndex("jf"));
                //药价格
                double price = cursor.getDouble(cursor.getColumnIndex("price"));

                Herbs herbs = new Herbs();
                herbs.setHerbid(herbid);
                herbs.setCyname(cyname);
                herbs.setNamereamrk(namereamrk);
                herbs.setDw(dw);
                herbs.setJf(jf);
                herbs.setPrice(price);
                list.add(herbs);

                cursor.moveToNext();
            }

            cursor.close();
        }

        return list;

    }

}
创建完成了最后有遇到问题,,,,,Sqlite Expert personal软件打开的我的db文件,我就按照上面的
字段进行实体化,最后发现这个软件会自动生成一个 rowid的字段,
导致我程序运行出错:Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
最后发现了,把多余的实体字段删掉就没事了。。。。可算是弄好了,弄了将近一天了,哈哈哈哈。。最好到首个启动的activity中初始化复制数据库到本地。

展开阅读全文

没有更多推荐了,返回首页