如何读取android asserts下面已经存在的sqlite数据库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何读取android asserts下面已经存在的sqlite数据库相关的知识,希望对你有一定的参考价值。

这个可以在每次应用开启时检测database文件夹下是否有这个名称的数据库,如果没有就从asserts中获得释放一次,给你看一下我的代码:

我的asserts里有一个文件叫做:address.db

/**
*在onCreate()方法中调用
*/
private File initDatabase ()
        BufferedInputStream     bis = null;
        BufferedOutputStream    bos = null;
        File                    file = getDatabasePath("address.db");
        byte []                 buffer = new byte[1024];
        int                     c;

        try 
            if (!file.exists())
                file.getParentFile().mkdirs();
            else
                return file;
            bis = new BufferedInputStream(getAssets().open("address.db"));
            bos = new BufferedOutputStream(new FileOutputStream(file));

            while ((c = bis.read(buffer)) != -1)
                bos.write(buffer, 0, c);

         catch (IOException e) 
            e.printStackTrace();
            return null;
        finally
            try 
                if (bis != null)
                    bis.close();
                if (bos != null) 
                    bos.close();
                    bos.flush();
                
            catch (IOException e)
                e.printStackTrace();
            
        
        return file;
    

参考技术A assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件。
assets的读取方式:
1. 先在Activity里面调用getAssets() 来获取AssetManager引用。
2. 再用AssetManager的open(String fileName, int accessMode) 方法则指定读取的文件以及访问模式就能得到输入流InputStream。
3. 然后就是用已经open file 的inputStream读取文件,读取完成后记得inputStream.close() 。
4.调用AssetManager.close() 关闭AssetManager。
需要注意的是,来自Resources和Assets 中的文件只可以读取而不能进行写的操作。
参考技术B 必须要在代码中建一个数据库,才可以访问,不然你直接放进去的数据库是访问不了的。
建好了数据库之后,你可以从手机中导出到电脑,再作修改后导入到手机,这样手机就可以访问了。希望能帮到你,

如何搜索所有地图键c ++

我想要实现的是一个基本的拼写检查器,它读取输入文本文件并将这些单词与一个小字典进行比较。如果单词不在字典中,则假定拼写错误,然后提示用户正确拼写单词。这个正确拼写的单词与拼写错误的对应词一起存储在地图中。到目前为止,我已经能够做到这一切。我无法弄清楚的是如何遍历整个地图以检查该密钥(拼写错误的单词)是否已经存在,而不是每次都询问用户如果在地图的迭代中找不到拼写它?下面是我到目前为止的代码,它检查单词是否在字典中,询问用户如何拼写它,并将其添加到地图中。

std::map<std::string,std::string>::iterator p = m_Replacements.begin();
            bool isIn = m_Dictionary.find(oneWord) != m_Dictionary.end();
            std::map<std::string,std::string>::iterator found = m_Replacements.find(oneWord);

            if(found==m_Replacements.end())
            {
                if( isIn == false)
                {
                    osInputPrompt<<"How do you correctly spell " + oneWord + "
";
                    isInputPrompt >> correctSpell;
                    m_Replacements.insert(make_pair(textWord,correctSpell));
                    osOutput<<correctSpell + " ";
                }
                else
                {
                    osOutput<<oneWord + " ";
                }

总而言之,我想在循环中添加另一个循环,检查单词是否在字典中然后检查整个地图以查看拼写错误的单词是否已经存在而不询问“你如何正确拼写... “对于地图循环的每次迭代。仅仅是为了澄清我不是要问如何迭代地图,我已经知道如何做到这一点。提前致谢。

答案
std::map<std::string,std::string>::iterator p;
std::string found;
for(p = m_repl.begin(); p != m_repl.end(); ++p)
{
     if(p->second == <what I am looking for>)
      {
         found = p->second;
         break;
     }
}

即循环整个字典。更新的c ++版本具有更好的枚举sytaxes - 请参阅How to use range-based for() loop with std::map?

另一答案

陷入了我正在做的事情但我通过添加这样的布尔值来解决这个问题,以避免向用户询问循环的每次迭代

bool mapFound;
                    for(std::map<std::string,std::string>::iterator it = m_Replacements.begin(); it!= m_Replacements.end(); it++)
                    {
                        std::string word = it->first;
                        if(word == oneWord)
                        {
                            mapFound = true;
                        }
                    }

以上是关于如何读取android asserts下面已经存在的sqlite数据库的主要内容,如果未能解决你的问题,请参考以下文章

android 存在数据库中的动态图片,如何读取出来,显示在ImageView中

如何sqllite数据库复制到android手机上

如何测试 Tabris 中是不是存在文件?

android如何获取assets文件夹下面文件的大小

如何从 android 信标中读取主要、次要

C ++读取应该已经存在的输出文件