База данных SQLite не обновляется после копирования с виртуальной машины Android на windows - PullRequest
0 голосов
/ 17 марта 2020

Я создал базу данных SQLite с помощью phpLiteAdmin и переместил ее в папку ресурсов моего проекта Android Studio и использовал приведенный ниже код для перемещения базы данных на Android Виртуальную машину

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class DatabaseHelper extends SQLiteOpenHelper {
    private static String DB_NAME = "myDb.db";
    private static String DB_PATH = "";
    private static final int DB_VERSION = 1;

    private SQLiteDatabase myDatabase;
    private final Context myContext;
    private boolean needUpdate = false;

    public DatabaseHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        if (android.os.Build.VERSION.SDK_INT >= 17)
            DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
        else
            DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
        this.myContext = context;

        copyDataBase();

        this.getReadableDatabase();
    }

    public void updateDataBase() throws IOException {
        if (needUpdate) {
            File dbFile = new File(DB_PATH + DB_NAME);
            if (dbFile.exists())
                dbFile.delete();

            copyDataBase();

            needUpdate = false;
        }
    }

    private boolean checkDataBase() {
        File dbFile = new File(DB_PATH + DB_NAME);
        return dbFile.exists();
    }

    private void copyDataBase() {
        if (!checkDataBase()) {
            this.getReadableDatabase();
            this.close();
            try {
                copyDBFile();
            } catch (IOException mIOException) {
                throw new Error("ErrorCopyingDataBase");
            }
        }
    }

    private void copyDBFile() throws IOException {
        InputStream mInput = myContext.getAssets().open(DB_NAME);
        OutputStream mOutput = new FileOutputStream(DB_PATH + DB_NAME);
        byte[] mBuffer = new byte[1024];
        int mLength;
        while ((mLength = mInput.read(mBuffer)) > 0)
            mOutput.write(mBuffer, 0, mLength);
        mOutput.flush();
        mOutput.close();
        mInput.close();
    }

    public boolean openDataBase() throws SQLException {
        myDatabase = SQLiteDatabase.openDatabase(DB_PATH + DB_NAME, null, SQLiteDatabase.CREATE_IF_NECESSARY);
        return myDatabase != null;
    }

    @Override
    public synchronized void close() {
        if (myDatabase != null)
            myDatabase.close();
        super.close();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (newVersion > oldVersion)
            needUpdate = true;
    }
}

, поэтому когда я вставил несколько строк в одну из таблиц (я знаю, что они успешно вставлены, потому что я пробовал их с регистрацией и входом в систему), но когда я экспортировал базу данных из виртуальной машины android обратно в windows (который находится в /data/data/com.example.myProject/databases/myDb.db) и проверил с помощью phpLiteAdmin, ничего не изменилось, строки не были добавлены. Что мне не хватает? Где находится обновленная база данных?

Редактировать: Вот мой код вставки

public void createAccount(View view) {
        try {
            ContentValues values = new ContentValues();
            values.put("username", txtUsername.getText().toString());
            values.put("password", txtPassword.getText().toString());
            values.put("phone", txtPhone.getText().toString());
            values.put("role", "user");
            if (myDb.insert("Users", null, values) > 0) {
                Toast.makeText(this, "Registered successfully!\nNow you can login with your username and password", Toast.LENGTH_LONG).show();
            }
//            myDb.execSQL("INSERT INTO Users(username, password, phone, role) VALUES('" + txtUsername.getText().toString() + "','" + txtPassword.getText().toString() + "','" + txtPhone.getText().toString() + "','user')");
        } catch (Exception e) {
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...