2017-09-09 80 views
0

我无法在我的新Android应用程序上打开Sqlite3数据库。为了解决问题,我创建了一个全新的应用程序。我把sqlite3数据库放在Assets文件夹下。无法在Android上打开sqlite数据库

在清单中,我放入下列行:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

我在该试验中应用只是一个活动,并且这是在该活动的代码。它只做一件事:attempts to open the db。它立刻死亡,并打印出一个错误控制台(细节下文)

public class MainActivity extends AppCompatActivity { 

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

     Context context = getApplicationContext(); 
     String db_path = String.valueOf(context.getDatabasePath("production.sqlite3")); 

     SQLiteDatabase db = SQLiteDatabase.openDatabase(db_path, null, SQLiteDatabase.OPEN_READWRITE); 

    } 
} 

下面是从日志相关的错误:

09-09 20:10:54.788 9850-9850/? E/SQLiteLog: (14) cannot open file at line 31278 of [2ef4f3a5b1] 
09-09 20:10:54.788 9850-9850/? E/SQLiteLog: (14) os_unix.c:31278: (2) open(/data/user/0/com.hawthornemackenzie.sesame/databases/production.sqlite3) - 
09-09 20:10:54.788 9850-9850/? E/SQLiteDatabase: Failed to open database '/data/user/0/com.hawthornemackenzie.sesame/databases/production.sqlite3'. 
               android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database 

这似乎是从getDatabasePath得到一个有效的路径通话,但似乎是说该文件不存在。

+0

该文件存在,但畸形...'无法打开文件在line' ...是加密的? –

+0

你有试过这个图书馆吗? https://github.com/jgilfelt/android-sqlite-asset-helper –

+0

不,没有加密。可以肯定的是,我实际上使用了一个我在另一个项目中积极使用的文件副本。也就是说,我使用复制粘贴将其放入IDE的资产文件夹中,并将其移到本机文件系统中。当我这样做时,我收到一条消息,说它不是一个UTF-8文件,这并不奇怪,因为它不是文本。但是有没有更好的方法将文件转移到资产中? – hawmack13

回答

1

如果您阅读日志,它会得到路径,但除非您明确将数据库复制到应用程序的私人数据文件夹中,否则无法打开它。

另外值得一提的是资产是只读的,所以即使它可以打开数据库,您也只能使用SELECT语句。

参见:Reading sqlite file from asset folder