Zugriff auf Verzeichnisse und Dateien

M

MikelKatzengreis

Neues Mitglied
1
Hallo, folgenden kleinen Code habe ich geschrieben in der Absicht auf eine bestimmte Datenbank auf dem Handy (Emulator) zugreifen zu können:

public void Checkdb() {
SQLiteDatabase checkDb = null;
String filePath = "/data/data/com.example.ern2/databases/ILMTHF.DB";
try {
checkDb = SQLiteDatabase.openDatabase(filePath, null, 0);
} catch (Exception e) {
e.printStackTrace();
}
if (checkDb != null) {
Toast.makeText(mcontext, "Datenbank besteht bereits", Toast.LENGTH_LONG).show();
} else {
CopyDatabase();
}
}

Den Pfad, so wie er sich im Device Explorer von AS darstellt habe ich vollständig ausgeschrieben.
Obwohl ich den Pfad und die Datei im Explorer sehe meckert die Exception:

android.database.sqlite.SQLiteCantOpenDatabaseException: Cannot open database '/data/data/com.example.ern2/databases/ILMTHF.DB': Directory /data/data/com.example.ern2/databases doesn't exist

Die Angabe zu Pfad und Datei ist 95mal überprüft und ist richtig, dennoch kommt diese Meldung.
Oder kann ich garnicht so einfach auf Verzeichnisse im Handy zugreifen?
 
Das hatten wir aber schon mal hier :

Falsche Database wird verwendet (Android App Entwicklung)

Bitte meine Antworten genau lesen , ich denke mir schon was dabei :)
Noch dicker, fetter und farbiger kann ich es nicht darstellen ....

Du kannst auf einem Device keinen absoluten Pfad angeben - er ist bei jedem Device anders - das zeigt dir auch nicht der Device Explorer in AS an. Jedes Cache Drive ist anders gemounted

Sauber :

a) Erst mal deine db unter files / cache in einen subfolder platzieren e.g. files/mydatabases/ILMTHF.DB
(p.s. man nimmt i.d.R. keine Uppercases - das mögen manche Geräte auch nicht)

b) dann pfad so ermitteln
Code:
String filePath =  String.format("%s/mydatabases/ILMTHF.DB", context.getFilesDir()))


ABER :
Deine Vorgehensweise ist falsch .. das steht auch im obigen Link
Erstelle Dir eine eigene Klasse und erweitere den Rumpf mit SQLiteOpenHelper
Darin arbeitest du mit SQLiteDatabase db1 = this.getWritableDatabase();


Snippet:
Code:
public class CitiesDB extends SQLiteOpenHelper
{
    private static final int DATABASE_VERSION = 1;
    private final String TAG = "_WD_LOCATIONDB";

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {}
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}

    ////////////////////////////////////////////////////////
    public CitiesDB(Context context, String dbfilename)
    {
        super(context, dbfilename, null, DATABASE_VERSION);

        try
        {
            File filePath = new File(String.format("%s/weather/", context.getFilesDir()));
            if (!filePath.exists()) filePath.mkdirs();
            SQLiteDatabase db1 = this.getWritableDatabase();
            db1.execSQL(CREATE_TABLE_LOCATIONDATA);

            db1.close();

        }  catch (Exception jj){}
    }
}

Usage :
Code:
 mCitiesDatabase         = new CitiesDB      (mContext, mContext.getFilesDir() + "/weather/cities"+CORE.d().DB_VERSION+".db");



Und ganz zum Schluss :
Warum machst du nur für den Check die DB auf ? - Das ist in dem Falle sinnlos (fileExist())
 
Zuletzt bearbeitet:
Hi, da werde ich mich jetzt durcharbeiten.
Danke für Deine Mühe. Warum ich die DB anspreche? Ich möchte deren Inhalte einlesen, in der app diese Daten ggf. ändern, neue hinzufügen oderlöschen und wenn alles erledigt ist, diese Daten dann in die DB zurückschreiben.
Eigentlich könnte das ein Punkt sein, der in der ursprünglichen app, die die DB erzeugt, erledigt werden könte.
Ich möchte den ersten Teil als einen für den Anwender nutzbaren Teil anlegen. Der erneute Zugriff aus einer anderen app heraus soll für "Administratoren" reserviert sein.
 
Mein snippet erledigt das schon alles
 
MikelKatzengreis schrieb:
Eigentlich könnte das ein Punkt sein, der in der ursprünglichen app, die die DB erzeugt, erledigt werden könte.
Verstehe ich das richtig du wisst die DB einer andern App die in ihren eignen APP Speicher Bereich liegt bearbeiten.?
"/data/data/com.example.ern2/databases" der deiner app ist bestimmt anders deine App heist bestimmt nicht "com.example.ern2"

Das geht nicht da du keinen Zugriff auf den andren App Speicherbereich hast. Auch nicht wenn du den genauen Speicherort kennst und angibst.
 
  • Danke
Reaktionen: swa00
@jogimuc

Stimmt eindeutig , habe ich völlig überlesen :)
(Ich dachte, sein eigener paketname wäre com.example.ern2)
 
Zuletzt bearbeitet:

Ähnliche Themen

B
Antworten
4
Aufrufe
544
bb321
B
G
Antworten
8
Aufrufe
1.222
gnome2012
G
A
Antworten
10
Aufrufe
1.967
swa00
swa00
Zurück
Oben Unten