данные, потерянные после копирования sqlite - PullRequest
0 голосов
/ 23 апреля 2019

Я копирую базу данных из активов после того, как эта таблица данных теряется

это android studio и копирует базу данных из активов

ошибка = нет такой таблицы: tbltexts (код 1 SQLITE_ERROR):, при компиляции: SELECT * FROM tbltexts

my dbname = text.db

ЭТА ОШИБКА НА ПИРОГЕ АНДРОИДА

public class Databasehelper extends SQLiteOpenHelper {

    public static String DB_PATH = "/data/data/com.nooshindroid.Rosary/databases/";
    public static final String DATABASE_NAME = "texts.db";
    private static final int DATABASE_VERSION = 1;
    public static final String tblname ="tbltexts";
    public static final String id="id";
    public static final String arabic ="Arabic_text";
    public static final String english ="English_text";
    public static final String counter ="Counter";
    public static final String goal ="Goal";
    private Context context;
    private SQLiteDatabase database;
    public Databasehelper(Context context) {
        super(context, DATABASE_NAME, null,DATABASE_VERSION);
             this.context = context;

    }

    @Override
    public void onCreate(SQLiteDatabase db) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
    public void copyDataBase() throws IOException {
        InputStream myInput = context.getAssets().open(DATABASE_NAME);
        String outFileName = DB_PATH + DATABASE_NAME;
        OutputStream myOutput = new FileOutputStream(outFileName);
        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 class DbHandler {


    private SQLiteDatabase database;
    private  String name;
    private Databasehelper dbHelper;
    public DbHandler(Context context){
        dbHelper=new Databasehelper(context);
    }
    public void open(){
        database=dbHelper.getWritableDatabase();
    }

    public  void close(){
       database.close();
    }

    public String display(int row,int field){

        Cursor cursor=database.query(dbHelper.tblname,null,null,null,null,null,null,null);
            cursor.moveToPosition(row);
           name=cursor.getString(field);
        return name;
    }



    public boolean insert(String txtarab,String txtenglish,int goal) {

        ContentValues cv = new ContentValues();
        cv.put(dbHelper.arabic, txtarab);
        cv.put(dbHelper.english, txtenglish);
        cv.put(dbHelper.goal,goal);
        long result = database.insert(dbHelper.tblname, null, cv);
        database.close();

        if (result == -1) {
            return false;
        } else {
            return true;
        }
    }

    public Integer count(){
        Cursor cursor=database.query(dbHelper.tblname,null,null,null,null,null,null);
        int s=cursor.getCount();
        return s;
    }
    public void delete(int id){
        database.delete(dbHelper.tblname,"id="+id,null);
    }
    public void update(String arab, String englsih, int id){
        ContentValues contentValues=new ContentValues();
        contentValues.put(dbHelper.arabic,arab);
        contentValues.put(dbHelper.english,englsih);
        database.update(dbHelper.tblname,contentValues,"id="+id,null);
    }

    public void counterupdate(int id,int counter){
        ContentValues contentValues=new ContentValues();
        contentValues.put(dbHelper.counter,counter);
        database.update(dbHelper.tblname,contentValues,"id="+id,null);
    }

}

1 Ответ

2 голосов
/ 23 апреля 2019

Вы не должны жестко задавать путь к базе данных, нет гарантии, что это будет /data/data/<package_id>/databases, например, на моем телефоне (Android Pie, API 26) это /data/user/<user_id>/<package_id>/databases.Документация даже предупреждает, что путь может измениться, так как приложение может быть перемещено в принятое хранилище.

Если путь неправильный (и если исключение из copyDataBase() перехвачено), вы в итоге создаете пустую базу данныхавтоматически SQLiteOpenHelper.

Решение может быть следующим:

String outFileName = DB_PATH + DATABASE_NAME;

на:

String outFileName = context.getDatabasePath(DATABASE_NAME);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...