从资产文件夹复制数据库[重复]

2024-01-10

我正在创建一个使用现有 sqlite 数据库的字典应用程序。我已将数据库放置在资产文件夹中,并在应用程序首次启动时使用以下代码来复制数据库。 (我借用了这个想法this http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ post)

数据库助手.java

public class DatabaseHelper {

private static String DB_PATH = "";
private static String DB_NAME = "abc.sqlite";
private SQLiteDatabase myDatabase;
private Context myContext;

public DatabaseHelper(Context context) {

    myContext = context;

    if (android.os.Build.VERSION.SDK_INT >= 17)
        DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
    else
        DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
    Log.d("path", DB_PATH);
}

public void copyDatabase() {

        InputStream myInput;
        OutputStream outStream;
        try {
            myInput = myContext.getAssets().open(DB_NAME);
            String file = DB_PATH + DB_NAME;
            outStream = new FileOutputStream(file);

            byte[] buffer = new byte[1024];
            int length = 0;
            while ((length = myInput.read(buffer)) >= 0) {
                outStream.write(buffer, 0, length);             
            }
            outStream.flush();
            myInput.close();
            outStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
}

然后我调用上面的copyDatabase()方法形成我的MainActivity。这是代码。

public class MainActivity extends Activity {
    DatabaseHelper myDbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.layout);
        myDbHelper = new DatabaseHelper(getApplicationContext());
        myDbHelper.copyDatabase();


    }

}

但问题是Android不复制数据库。我使用了 Log 工具,发现 while 循环从未运行。 这段代码有什么问题。 谢谢。


如下更改 while 循环:

除了你的条件之外>=大于或等于将其更改为仅>比...更棒

while ((length = myInput.read(buffer)) > 0) {
            outStream.write(buffer, 0, length);             
        }

尝试下面的代码,它会像魅力一样为您工作。

public class DataBaseHelper extends SQLiteOpenHelper {
    private Context mycontext;
    private String DB_PATH; 

    private static String DB_NAME = "abc.sqlite";
    public SQLiteDatabase myDataBase;


    public DataBaseHelper(Context context) throws IOException {
        super(context,DB_NAME,null,1);
        this.mycontext=context;
        boolean dbexist = checkdatabase();
        if (dbexist) {
              opendatabase(); 
        } else {
            System.out.println("Database doesn't exist");
            createdatabase();
        }
    }

    public void createdatabase() throws IOException {
        boolean dbexist = checkdatabase();
        if(!dbexist) {
            this.getReadableDatabase();
            try {
                copydatabase();
            } catch(IOException e) {
                throw new Error("Error copying database");
            }
        }
    }   

    private boolean checkdatabase() {

        boolean checkdb = false;
        try {
            String myPath = DB_PATH + DB_NAME;
            File dbfile = new File(myPath);
            checkdb = dbfile.exists();
        } catch(SQLiteException e) {
            System.out.println("Database doesn't exist");
        }
        return checkdb;
    }

    private void copydatabase() throws IOException {
        //Open your local db as the input stream
        InputStream myinput = mycontext.getAssets().open(DB_NAME);

        // Path to the just created empty db
        String outfilename = DB_PATH + DB_NAME;

        //Open the empty db as the output stream
        OutputStream myoutput = new FileOutputStream(outfilename);

        // transfer byte to inputfile to outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myinput.read(buffer))>0) {
            myoutput.write(buffer,0,length);
        }

        //Close the streams
        myoutput.flush();
        myoutput.close();
        myinput.close();
    }

    public void opendatabase() throws SQLException {
        //Open the database
        String mypath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(mypath, null, SQLiteDatabase.OPEN_READWRITE);
    }

    public synchronized void close() {
        if(myDataBase != null) {
            myDataBase.close();
        }
        super.close();
    }

}

In your MainActivity您现在需要创建您的实例DatabaseHelper其他班级将自行管理。

public class MainActivity extends Activity {
    DatabaseHelper myDbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.layout);
        myDbHelper = new DatabaseHelper(MainActivity.this);
      }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从资产文件夹复制数据库[重复] 的相关文章

  • PopupWindow onitemclick 中的 Android Listview 在某些设备上不起作用

    我的 ListView 在 PopupWindow 内 当我显示 PopupWindow 并单击设备 ASUS K00z 中的 Listview 行时 fonepad 工作得很好 但在 HTC Z715e 中不起作用 项目单击事件未触发 1
  • Facebook4j API:搜索

    我正在使用 Facebook4j 通过关键字获取状态 facebook4j conf ConfigurationBuilder fac new facebook4j conf ConfigurationBuilder fac setDebu
  • cv2.imdecode 始终返回 None

    我正在从存储 JPEG 图像的 sqlite BLOB 读取二进制数据 sqlite3 Binary 图像被写入数据库 img cv2 imread images image jpg c execute INSERT INTO pictur
  • 地理编码 API 与地理编码器

    在我的应用程序中 我需要使用地理编码 但我不太清楚该使用哪种方法 直到昨天我在URL中添加了参数maps googleapis com maps api geocode json address myparameter sensor fal
  • 我如何从android中的复选框获取值

    我想获取复选框中所选项目的名称 但我只得到一些字母数字 如何从复选框中获取所选项目的名称 public View getView int position View convertView ViewGroup parent View vie
  • 尝试获取屏幕上绘制的每个随机圆圈的 x、y 坐标

    您好 我正在制作一款游戏 该游戏将在屏幕上创建随机圆圈 随机创建的圆圈的值为红色或绿色 我的问题是 我希望不仅能够确定用户何时单击其中一个圆圈 而且还能够确定他们最终单击的圆圈 红色或绿色 下面是我的代码 我的主要问题是试图找到将要绘制的圆
  • 作为附件的 Android 设备

    我有 2 个 Android 设备 我想用 USB OTG 电缆连接它们 并在两个设备之间进行来回通信 据我了解 一台 Android 设备将充当 USB 主机 运行 4 4 的 Nexus 7 另一台 Android 设备将充当 USB
  • AltBeacon 服务位于单独的 Android 进程中

    我需要帮助 有一个适用于 Xamarin Android 的应用程序 在其中 启动了一个与 AltBeacon 库配合使用的服务 在此服务中 创建了一个线程 在该线程中不断扫描信标 服务以 StartForeground 启动 该服务应该有
  • startActivityForResult中的requestCode是什么意思

    我想知道我是否正确理解 requestCode 的概念 这个整数的用途是什么 我将其设置为哪个整数有关系吗 private static int CAMERA REQUEST 谢谢 requestCode 可帮助您识别您从哪个 Intent
  • 该项目可能使用的 Gradle 版本不包含“compileSdkVersion()”方法

    当我尝试运行最初在 Eclipse ADT 上创建的项目时 我遇到了这个问题 Error 17 0 Gradle DSL method not found compileSdkVersion Possible causes ul li Th
  • 多级排序

    我有一个表 其中包含一些记录 其中包含名称 评级等字段 我首先想要根据评级将结果限制为 20 进行排序 然后在此结果集上想要进一步应用基于名称的排序 我知道要排序我们需要使用像这样的查询 Select from table order by
  • Android:如果任务管理器终止,则重新调用应用程序

    如果应用程序线程被任务管理器杀死 则应用程序线程将关闭 需要重新调用应用程序 就像它被其他应用程序或任务管理器杀死一样 任何想法 您必须使用 START STICKY 命令运行后台服务 只需扩展 Service 并重写 onCommand
  • 从 Android 访问云存储

    我一直无法找到任何有关如何从 Android 应用程序使用云存储的具体文档 我确实遇到过这个客户端库 https cloud google com storage docs reference libraries然而 Google Clou
  • phonegap html5 android 同步文件系统 IO

    如何使用 PhoneGaps 文件系统 API 同步读写文件 有可用的同步包装器吗 无法通过提供的 api 同步访问文件 从phonegap的实现方式猜测 我怀疑您是否可以编写一个插件来同步执行此操作
  • LinearLayout:防止最后一个孩子被之前的大文本视图推出或挤压

    我有一个LinearLayout里面有两个孩子 第一个是TextView对于动态内容 第二个是一个按钮 我的问题是按钮被推出其父级或被挤压到不再可见的程度 我想要TextView认识到其父母与第二个孩子一起没有更多空间 并开始新的一行 而不
  • 如何向开关对象添加/更改波纹效果

    下面是我自定义的开关 红圈是默认的波纹效果 我发现设置一个波纹可绘制作为开关的背景 控制波纹的颜色
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • 如果我的应用程序安装在 SD 卡上,私人数据也在那里吗?

    我假设应用程序的私有数据 例如 SharedPreferences 和 SQLite 数据库 位于手机的内部存储而不是 SD 卡上 即使应用程序本身安装在 SD 卡上 我在任何地方都找不到对此的简单明确的确认 有人可以确认一下吗 是的 私有
  • Android Volley - 发布请求 - 无法在线工作

    我试图通过 Volley 发出 POST 请求 它在我的本地主机中工作得很好 但是当我将它移动到网络服务器时 响应为空 Java代码 RequestQueue queue Volley newRequestQueue this String
  • Android 版本低于 Lollipop 时出现 java.lang.NoClassDefFoundError

    我有一台运行 Android 21 的 Nexus 5 设备 我正在测试我的项目 没有任何问题 但是 如果我使用 Google API 19 在模拟器上进行测试 则会显示错误java lang NoClassDefFoundError 如果

随机推荐

  • 为 iPhone 中的图像添加边框

    我在自定义单元格中有一张图像 有没有给图片添加灰色边框的API 提前致谢 如果您使用的是 iPhone OS 3 0 则可以使用图像视图的 CALayer 的 borderWidth 和 borderColor 属性在图像上添加边框 如下所
  • 在 Mac 中以编程方式禁用菜单栏和停靠栏

    我是 Mac 编程新手 我必须执行一项任务 我需要创建一个应用程序 该应用程序将在启动时运行并覆盖整个屏幕 并且在插入自定义密码之前不会关闭 菜单栏和停靠栏需要隐藏在该应用程序后面 并且在给出信息之前无法关闭该应用程序 到目前为止 我已经编
  • Git master分支没有上游分支

    我正在尝试将我的一个项目推送到 github 但我不断收到此错误 fatal The current branch master has no upstream branch 我以前从未见过这个 我重新初始化了 git 重新添加了我的 or
  • android jcodec:如何设置帧速率

    我有一组图像 我想生成幻灯片作为视频文件 我正在使用jcodec 当我对帧进行编码时 是否可以指定该帧必须显示一定的时间 例如 1 秒 是的 可以指定帧的时间 它的解释是https github com jcodec jcodec issu
  • 在 Xcode 中自动生成方法注释

    Xcode 中有没有一种方法可以自动生成方法注释 类似于您在 Eclipse 中对 javadoc 注释所做的操作 例如 您可以在方法声明之前的一行点击 Eclipse 会自动生成方法注释的框架 您可以使用快捷方式创建标题文档 where
  • 如何为我的 ListView 项目创建可绘制的状态列表?

    我有一个自定义 ListView 选择器 它在 ListView 之上绘制 它工作正常 但我希望列表视图内的文本变成白色 我怎样才能做到这一点
  • iphone sdk tabbar 查看插座未设置

    我对这个该死的项目已经束手无策了 我有一个 UIViewController 类 它链接到一个笔尖 该笔尖有一个带有 2 个选项卡的选项卡栏控制器 两个选项卡都会加载 nib 文件 当我编译时出现错误 UIViewController lo
  • 如何在pygame中制作网格

    我正在尝试用 Python 创建一个基本的贪吃蛇游戏 但我不熟悉 Pygame 我创建了一个窗口 并尝试根据窗口的大小和设定的正方形大小将该窗口拆分为网格 def get initial snake snake length width h
  • 在 jQuery 中创建一个更改图像的间隔?

    我有一个像这样的工作脚本 jQuery document ready function video thumb img bind mouseover function var new this attr src replace defaul
  • 如何从一个类访问另一个类的变量值?

    我想从一个类访问另一个类的字符串 我使用的属性方法如下 Myclass cs public class MyClass private string user public string user get return this user
  • 移动的对象没有相同的地址[重复]

    这个问题在这里已经有答案了 我认为一个物体是moved从一种绑定到另一种绑定仅仅意味着对象位本身保持不变 只是程序源使用不同的绑定 标识符 来引用它 use std fmt struct Person name String age u8
  • 动态禁用和启用单选按钮

    我正在创建一个简单的 DISC 配置文件测试 其中每个问题都有 8 个单选按钮 如果我选中伟大的 M 单选按钮 伟大的 L 单选按钮将被禁用并且无法选择 您必须选择其他类似的强大 善良或勇敢 表格看起来像这样 我正在尝试使用 jQuery
  • 使用 do-while 循环测试输入是否为整数且大于(两个条件) - Java

    我需要用户输入大于 10 的整数 这是我的代码 import java util program uses class Scanner public class Tests public static void main String ar
  • 为 4.70 或 5.0 组件配置 Blackberry Eclipse 插件

    我正在寻求配置 Blackberry 开发环境的帮助 事实上 这是一个相当令人沮丧的过程 黑莓网站没什么用 事实证明 在已移动的链接 假定的细节和过时的文档之间 黑莓的开发很难取得任何进展 唷 现在我的咆哮结束了 这是我的问题 我终于让 E
  • 使用父级获取可绘制资源

    当我定义样式时 它可以从父样式继承 例如 现在我想对可绘制资源执行相同的操作 如下所示
  • Qt 样式表。背景颜色,是的。背景图像,NO

    这是样式表的一个奇怪问题 我有一个窗口 QWidget 类的子窗口 我对其应用样式表 以理想地将整个窗口的背景更改为带有重复 x 和重复 y 的图像 并将其平铺 样式表 管道 有效 如果我使用 背景颜色 并将其设置为红色 则整个窗口将被漆成
  • 使用robotframework-selenium时如何测试空白文本字段?

    将 robotsframework seleniumlibrary 与 TSV 文件一起使用时 如何为文本字段指定空白 空值 例如 我有以下内容 Textfield Value Should Be identifier name1 Chri
  • MySQL 行校验和

    是否可以选择表中的整行并获取校验和 我正在寻找一种方法来告诉我的代码仅在至少一条记录已更改时才更新数据 从数据更改跟踪的角度来看 它将帮助我缩小历史表中记录的许多更改的规模 您可以结合MD5 https dev mysql com doc
  • 如何在 JSP 中绑定动态字段列表

    我正在构建一个用于输入足球比赛结果的 JSP 页面 我得到了一份未解决的游戏列表 我想将它们列出如下 team1 vs team4 hidden field game id input field for home goals input
  • 从资产文件夹复制数据库[重复]

    这个问题在这里已经有答案了 我正在创建一个使用现有 sqlite 数据库的字典应用程序 我已将数据库放置在资产文件夹中 并在应用程序首次启动时使用以下代码来复制数据库 我借用了这个想法this http www reigndesign co