当前位置: 首页 > 知识库问答 >
问题:

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

席波娃
2023-03-14
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();
        }

    }
}
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();


    }

}

共有1个答案

邵展
2023-03-14

如下所示更改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();
    }

}
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);
      }

}
 类似资料:
  • 问题内容: 我想在应用程序的第一次运行中将一个很大的目录从我的应用程序的Assets文件夹复制到data文件夹。我怎么做?我已经尝试过一些示例,但是没有用,所以我什么都没有。我的目标是Android 4.2。 谢谢,Yannik 问题答案: 尝试使用您的Application实例的以下代码(您应该在清单中编写该类):该代码将资产/文件文件夹的内容复制到应用程序的缓存文件夹中(您可以将其他路径放在c

  • 问题内容: 我尝试从资产目录复制SQLite数据库,以便以后访问。但是我做不到! DatabaseHelper很简单: 尝试了一切!我尝试玩扩展!但是我仍然收到一个错误:复制数据库时出错: 我检查了模拟器,我的文件在那里,所以我应该可以写它!请任何帮助!真让我发疯! UPD 我试图将其放在SD卡上,并且可以正常工作。但仍然无法理解为什么我无法将其写入应用程序数据文件夹。 问题答案: 我使用此助手,

  • 我尝试了多种方法将我的sqlite db文件复制到我的 /data/data/packagename/databases文件夹,但我仍然被困在FileNotFoundException中,由FileOutputStream对象触发...下面是代码: 这就是错误: 02-09 01:28:46.384 24222-24222/ /data/dataW/Scom.test.michelemadeddu

  • 我正在尝试使用maven resources插件复制文件夹或以下结构: 项目目录和. gitignore文件被复制,但是。元数据目录由于某种原因被遗漏了。 如何复制根文件夹的所有内容? 以下是我尝试过的配置:

  • 问题内容: 我已经卸载了旧的XAMPP并删除了其中的所有内容并安装了新的XAMPP 。当我将备份文件夹(具有我的数据库名称,包含所有和文件)复制到时,该数据库显示在phpmyadmin的列表中,但没有表和数据。我做错了什么? 问题答案: 我搜了很多。还有一些其他文件需要恢复。我认为仅从.frm文件中恢复表是不可能的。我已经重新创建了数据库。

  • 该文件位于我的资产文件夹下。因此,我正在设置WebViewClient并将我的页面加载到其中。但是我得到一个“网页不可用”的错误。 以下是我的活动代码: 和布局文件: