• Как выяснить причину ошибки "database disk image is malformed" в android?

    pinkertem
    @pinkertem Автор вопроса
    В итоге нашел некий код на so, немножко адаптировал и получилось
    вот что

    public class DbHelper extends SQLiteOpenHelper {
        private static final String DB_NAME = "mydatabase.db";
        private static final String DB_DIRECTORY = "/data/data/com.example.sampleprogname/databases/";
        private static final String DB_FILEPATH = DB_DIRECTORY + DB_NAME;
        private static final int DB_VERSION = 4;
    
        private SQLiteDatabase db;
        private Context context;
        private static DbHelper dbHelper;
    
        public static DbHelper getInstance(Context context) {
            if (dbHelper == null) {
                // Хотя context приходит от конкретной активити, но это контекст application
                dbHelper = new DbHelper(context);
            }
            return dbHelper;
        }
    
        private DbHelper(Context context) {
            super(context, DB_NAME, null, DB_VERSION);
            this.context = context;
    
            if (dbExists()) {
                opendDb();
            } else {
                createDb();
            }
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    
        }
    
        public void createDb() {
            if(!dbExists()) {
                this.getReadableDatabase();
                try {
                    copyDbFromAssetsToDevice();
                } catch(IOException ex) {
                    Log.e("db-copy", "Не удалось скопировать БД на устройство: " + ex.getMessage());
                }
            }
        }
    
        private void copyDbFromAssetsToDevice() throws IOException {
            try {
                InputStream istream = context.getAssets().open(DB_NAME);
                OutputStream ostream = new FileOutputStream(DB_FILEPATH);
    
                byte[] buffer = new byte[1024];
                int length;
    
                while ((length = istream.read(buffer)) > 0){
                    ostream.write(buffer, 0, length);
                }
    
                ostream.flush();
                ostream.close();
                istream.close();
            } catch (Exception e) {
                Log.e("db-copy", e.getMessage());
            }
        }
    
        private boolean dbExists() {
            boolean dbExist = false;
            try {
                File dbfile = new File(DB_FILEPATH);
                dbExist = dbfile.exists();
            } catch(SQLiteException e) {
                Log.e("Database does not exists", e.getMessage());
            }
            return dbExist;
        }
    
        public void opendDb() throws SQLException {
            db = SQLiteDatabase.openDatabase(DB_FILEPATH, null, SQLiteDatabase.OPEN_READONLY);
        }
    
        public synchronized void closeDb() {
            if(db != null) {
                db.close();
            }
            super.close();
        }
    }

    Некоторые части кажутся мне лишними и абсурдными, но это народные средства против официальной медицины и они просто работают.
    Ответ написан
    Комментировать
  • Как убрать или изменить порт в уже существующем Docker контейнере?

    pinkertem
    @pinkertem
    Сорри за некропостинг, но не понятно, в чем может быть проблема "одинаковых портов", если при запуске контейнера он становится самостоятельным "компьютером" во внутренней сети докера и, стало быть, его порты - это только его порты. Значит, если вы запускаете несколько контейнеров, у которых "пересекаются" порты, то на самом деле они не пересекаются, т.к. находятся на разных "компьютерах". "Пересекаться" они могут только как бы "на выходе" из докера, т.е. на вашем комьютере, где работает докер. А это решается указанием разных "внешних" портов в docker-compose например.
    Ответ написан
  • Какие есть хорошие Современные книги по PL SQL?

    pinkertem
    @pinkertem Автор вопроса
    Кажется, в официальной доке оракла есть свежая информация, она хорошо структурирована и даже написана человеческим языком, а не канцелярским. То, что нужно.
    Ответ написан
    Комментировать
  • Как лучше реализовать валидацию класса, сгенерированного Entity Framework'ом?

    pinkertem
    @pinkertem Автор вопроса
    Удобнее всего это сделать через partial класс.

    Все классы, создаваемые EF, уже являются partial, т.е. можно создать еще один класс с таким же именем, тоже объявить его partial и дописать в него требуемую функциональность. После компиляции partial классы сольются в один. Важно: partial классы должны лежать в одном неймспейсе.

    В моем случае EF классы лежат в папке Model/Entities. Я создал папку Model/EntitiesExt и в ней создал partial класс Employees. Переименовал вручную при этом неймспейс Model.EntitiesExt в Model.Entities. Таким образом оба класса оказались в одном неймспейсе, хотя и в разных папках. Дописал в свой Employees метод IsValid и, собственно, на этом все. Если вдруг перегенерировать EF классы, то мой класс останется нетронутым.
    Ответ написан
    Комментировать
  • Какие книги есть для новичков по C# в 2020?

    pinkertem
    @pinkertem
    Если именно по языку, то "Полный справочник" Бена и Джозефа Албахари очень хороший вариант. Можно прочитать первые главы и после них наверное уже не будет никаких конструкций языка, которые смогут вас удивить. Кроме того, там хорошо написано про Linq.
    Ответ написан
    Комментировать