1

I'm trying to use LiteDB within a Xamarin Forms application, however I can't seem to gain access to write or read from the file.

Called from my MainViewModel.cs

LiteRepository Error

I've added the permissions to AndroidManifest.xml;

<uses-sdk android:minSdkVersion="23" android:targetSdkVersion="25" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_LOGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_USER_DICTIONARY" />
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.READ_SOCIAL_STREAM" />
<uses-permission android:name="android.permission.READ_SYNC_STATS" />
<uses-permission android:name="android.permission.REBOOT" />
<uses-permission android:name="android.permission.RESTART_PACKAGES" />
<uses-permission android:name="android.permission.SET_ORIENTATION" />
<uses-permission android:name="android.permission.SET_DEBUG_APP" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_PROFILE" />
<uses-permission android:name="android.permission.WRITE_GSERVICES" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

I've added permission for my application in Android 6.0;

Android 6.0 Permissions

Update: I've checked path access, and can write out files.

string documentsPath = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;

var dirPath = documentsPath + "/MyTestFolder";
var exists = Directory.Exists(dirPath);
var filepath = dirPath + "/test.txt";
if (!exists)
{
    Directory.CreateDirectory(dirPath);
    if (!System.IO.File.Exists(filepath))
    {
        var newfile = new Java.IO.File(dirPath, "test.txt");
        using (FileOutputStream outfile = new FileOutputStream(newfile))
        {
            string line = "The very first line!";
            outfile.Write(System.Text.Encoding.ASCII.GetBytes(line));
            outfile.Close();
        }
    }
}

Yet, this code fails;

string documentsPath = Android.OS.Environment.ExternalStorageDirectory.AbsolutePath;
var dirPath = documentsPath + "/MyData/MyDB.db";
if (!Directory.Exists(dirPath))
{
    Directory.CreateDirectory(dirPath);
}

using (var db = new LiteDatabase(dirPath))
{
    // Get customer collection
    var collection = db.GetCollection<T>(typeof(T).Name);
    collection.Insert(tobj);
    return true;
}
wonea
  • 4,783
  • 17
  • 86
  • 139

2 Answers2

2

You need to use the following code in Android to access store/access your files:

var documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
var dirPath = Path.Combine(documentsPath, "MyDB.db");
hugo
  • 1,829
  • 1
  • 18
  • 47
0

If I use the repository pattern, all is well.

using (var db = new LiteRepository("/storage/emulated/0/MyData/MyDB.db"))
{
    db.Insert(new TestClass {Id = 1});
}

LiteDB Repository Pattern https://github.com/mbdavid/LiteDB/wiki/LiteRepository

wonea
  • 4,783
  • 17
  • 86
  • 139
  • Are you sure /storage/emulated will work in every case? – hugo Jul 12 '17 at 15:15
  • I'm not sure, but will make sure I have the permissions to read and write external storage and use Android.OS.Environment.ExternalStorageDirectory.AbsolutePath to get the path – wonea Jul 12 '17 at 15:58