如何将数据库从资产文件夹复制到数据库文件夹

2024-04-18

我的代码如下:

dbhelper.java

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion >= newVersion) return;
    db.execSQL("DROP DATABASE IF EXISTS " + DATABASE_NAME +";");
    onCreate(db);
}
@Override
public void onCreate(SQLiteDatabase db) {

    //here is the database definition
    db.execSQL("CREATE TABLE dhivehienglish " +
            "(mv TEXT, en TEXT);");
    //insert pre-configured records
    db.execSQL("INSERT INTO dhivehienglish (mv, en) VALUES('ކާރު','car');");
    db.execSQL("INSERT INTO dhivehienglish (mv, en) VALUES('ޖަހާ','hit');");
    db.execSQL("INSERT INTO dhivehienglish (mv, en) VALUES('އިނުން','sit');");
    db.execSQL("INSERT INTO dhivehienglish (mv, en) VALUES('ކެއުން','eat');");
}

}

MainActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_carian_kamus);

    //listing data processes
    //-initiate the database connector
    db = dbhelper.getReadableDatabase();

    txtmelayu=(EditText)findViewById(R.id.txtmelayu);
    btncari=(Button)findViewById(R.id.btncari);
    btncari.setOnClickListener(this);
    lblmakna=(TextView)findViewById(R.id.lblmakna);

}//end onCreate

public void onClick(View v){
    //fetch kata melayu dr textbox
    String carimelayu=txtmelayu.getText().toString();
    //kena letak dalam onclick
    //-run SELECT command to fetch data from table
    if (v.getId()==R.id.btncari){
        Cursor cmelayu=db.rawQuery("SELECT * FROM dhivehienglish " +
                "WHERE mv='"+carimelayu+"';", null);
        //-fetch record
        if(cmelayu.getCount()!=0){
            cmelayu.moveToFirst();//go to first row
            String en=cmelayu.getString(1).toString();
            lblmakna.setText(en);
        }
        else{
            //display some notice here saying no data found
            lblmakna.setText("Not found!");}}

}//end onCLick

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_carian_kamus, menu);
    return true;
}

//when menu is selected
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    //call about screen, if user hit "Tentang kami" menu
    if (item.getItemId()==R.id.minsert){
        Intent ins= new Intent (this, InsertActivity.class);
        startActivity(ins);
    }
    return true;
}}

如何从资产文件夹中移动现有数据库并将其用作应用程序沙箱中的本机数据库?非常感谢任何帮助。


修改你的createDataBase()方法在你的DatabaseHandler就像下面的代码:

创建数据库():

 public void createDataBase() throws IOException
{
    //If database not exists copy it from the assets

    boolean mDataBaseExist = checkDataBase();
    if(!mDataBaseExist)
    {
        this.getReadableDatabase();
        this.close();
        try 
        {
            //Copy the database from assests
            copyDataBase();
            System.out.println("createDatabase database created");
        } 
        catch (IOException mIOException) 
        {
            throw new Error("ErrorCopyingDataBase");
        }
    }
}

检查数据库():

private boolean checkDataBase()
{
    File dbFile = new File(DB_PATH + DB_NAME);
    //Log.v("dbFile", dbFile + "   "+ dbFile.exists());
    return dbFile.exists();
}

复制数据库():

//Copy the database from assets
private void copyDataBase() throws IOException
{
    InputStream mInput = mContext.getAssets().open(DB_NAME);
    String outFileName = DB_PATH + DB_NAME;

    OutputStream mOutput = new FileOutputStream(outFileName);
    byte[] mBuffer = new byte[1024];
    int mLength;
    while ((mLength = mInput.read(mBuffer))>0)
    {
        mOutput.write(mBuffer, 0, mLength);
    }
    mOutput.flush();
    mOutput.close();
    mInput.close();
}

Where DB_PATH = /data/data/YOUR_PACKAGE_NAME/Databases/,您可以在 DatabseHandler 的构造中初始化它,如下所示:DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
DB_NAME= YOUR_DATABASE_NAME_THAT_IS_STORED_IN_YOUR_ASSETS_FOLDER

我希望这有帮助。

P.S: DB_NAME 和 DB_PATH 都是字符串。

更新 :
每当您尝试使用您的实例时DatabaseHelper类,调用这个方法就可以了createDatabase()像这样 :

DatabaseHandler db = new DatabaseHandler(context);
   try 
    {
        db.createDataBase();
    } 
    catch (IOException io) 
    {
        throw new Error("Unable to create database");
    }

如果数据库尚未复制到数据库目录,它将从资产文件夹复制现有数据库。
我希望这有帮助。

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

如何将数据库从资产文件夹复制到数据库文件夹 的相关文章

随机推荐

  • std::ignore 用于忽略未使用的变量

    这是一个好的使用方法吗std ignore忽略未使用的变量 假设我有一个这样的函数 void func int i for some reason I don t need i anymore but I cannot change sig
  • MSTest - 如何为 UnitTest 项目初始化 log4net?

    我有一个 Visual Studio 单元测试项目 用于测试 ASP NET MVC 项目 添加程序集级别log4net Config XmlConfiguratorAssemblyInfo cs 的属性不起作用 SO 上的其他人发现他们必
  • 多个参与者,相同的用例 [用例]

    我试图描述一个用例 其中系统内的多个参与者可以执行相同的活动 例如 假设 作为示例 我想要使用 更新客户端 用例 但几个已确定的参与者可以执行此操作 Manager Chief Executive Customer Service Repr
  • 一个单元如何测试基于过程或基于事件的代码部分

    我确信来自这个演示文稿 http www masukomi org talks unit testing talk 2 index xul data slide data txt page2以及网站上的其他评论 我需要学习单元测试 我还意识
  • 将事件发送到特定线程

    我有一种情况 我想要一个线程来处理一些顺序逻辑 该线程有时需要与主线程交互才能更新用户输入 但它应该继续运行 否则不会影响主线程 我希望以事件驱动的方式执行此操作 以便主线程不必为中断而极力控制其他线程 做这个的最好方式是什么 是否有类似于
  • 为什么这个 SwiftUI Picker 代码不起作用?

    Xcode 11 2 1 下面的代码是一个包含两个组件的简单表单 选择器 选择字母 和文本 显示所选字母 代码编译并运行 但是当选择一个字母时 它不会出现在 选定 文本中 此外 第一次 仅 选择一个字母时 Xcode 会显示一个 虚假的 运
  • Graphics2D:在白色上绘制黑色?

    我确信这是一个非常愚蠢的问题 但我找不到答案 我对 Java2D API 没有经验 我正在尝试创建一个图像并将其写入 GIF 或 PNG 并且我希望它在白色背景上使用黑色笔 如果我不设置任何颜色 我会得到黑底白字 如果我使用 setPain
  • 在多级列 pandas 数据框中创建列的更好方法

    假设我有一个 pandas 多层列数据框架df像这样 A B gt first level x y x y gt second level 0 5 5 1 5 1 3 1 4 7 2 1 4 10 20 3 50 8 7 8 如何创建一个新
  • 如何在 Perl 中读取不断更新的文件?

    您好 我想通读一个文件 进入睡眠状态 然后检查是否有新记录写入该文件 如果是 我想处理记录 如果否 则返回睡眠并稍后再次检查 在永远循环中 我以为我可以做这样的事情 但是在它第一次读取文件之后 它似乎永远不会获取添加到文件中的新记录 ope
  • 数据变量没有从 Vue.js 中使用 Vuex 的计算属性的观察者更新

    Fiddle https jsfiddle net mjvu6bn7 https jsfiddle net mjvu6bn7 我有一个计算属性的观察者 它依赖于 Vuex 存储变量 该变量是异步设置的 当这个计算属性发生变化时 我试图设置
  • 如何使用 SVN 和 .NET 以编程方式进行文件版本控制?

    我们有一个报告生成器 每天 它都会将数据写入 Excel 文件 出于版本控制和文件数据安全的原因 我们需要更改此文件 并将更改提交到存储库中 您推荐您使用过的任何 net SVN API 吗 你应该看看SharpSvn http sharp
  • Spring boot 动态查询

    我的网络应用程序中有一个过滤器 允许按车辆类型 品牌 燃料 州和城市进行搜索 但所有这些过滤器都是可选的 我怎样才能使用存储库来做到这一点 控制器类 RequestMapping value vehicle search method Re
  • 为什么 GCC (9.3.0) 中仍然没有实现 `gets_s()`?

    I know fgets 是更常见和广泛的字符串输入选项 但 C11 已经存在 9 年了 为什么是gets s 还失业吗 即使我添加 std c11 它仍然不起作用 尽管gets s 应该在stdio h 因为它是可选的 还有背后的人gcc
  • Bootstrap 手风琴展开/折叠全部无法正常工作

    这是打破这个的过程 单击乐谱 单击全部展开 折叠 单击乐谱 单击全部展开 折叠 再次单击全部展开 折叠 请注意 音乐符号不会重新打开 尽管您应该能够在函数中看到 逻辑表明所有面板都已关闭并且应该打开 为什么 我究竟做错了什么 HTML
  • 使用 TextFinder 搜索范围比搜索整个工作表慢

    我有一张有很多行的表 数千行 我想在特定列中搜索文本 我在用Range createTextFinder但它超时了 如果Sheet只有4行数据 甚至会超时 This is very slow var found sheet getRange
  • 为什么window.onload事件发生在$(document).ready之前?

    正如该线程中所述 window onload 与 document ready https stackoverflow com questions 3698200 window onload vs document ready The wi
  • shell脚本不通过crontab运行,手动运行正常

    我尝试导出我的路径和变量 但 crontab 仍然不会运行我的脚本 我确信我做错了什么 我有一个运行 jar 文件的 shell 脚本 这无法正常工作 阅读周围后 我发现这通常是由于 cron 通过其自己的 shell 实例运行而导致路径不
  • ArrayListMultimap 与 LinkedListMultimap 有何不同?

    所以 我只是在阅读 javadocArrayListMultimap and LinkedListMultimap为了了解如何使用它们 我开始知道两者都支持重复的键值对 我的意思是相同的键 不同的值 如果我理解正确的话 如果我错了 请纠正我
  • Java中如何从HashMap中获取对象

    我试图在给定密钥时从 HashMap 获取测试对象的速度 但我不太确定该怎么做 我尝试过这种方式 但它是错误的 hash values getSpeed 有什么帮助吗 谢谢 class Test private String id priv
  • 如何将数据库从资产文件夹复制到数据库文件夹

    我的代码如下 dbhelper java Override public void onUpgrade SQLiteDatabase db int oldVersion int newVersion if oldVersion gt new