Лучший способ сохранить размер файла в SQLite

-1

Я разрабатываю приложение галереи с помощью RecyclerView и для каждого изображения я хочу сохранить размер изображения в базе данных, но я не могу понять, какой из них оптимальный способ хранения размера в базе данных, я должен использовать строку типа "2,5 КБ" "500 МБ" или с реальные числа в мегабайтах или байтах, пожалуйста, назовите меня, какой метод лучше всего подходит для чтения и записи. В настоящее время я получаю размер файла во время выполнения в методе RecyclerView onBindViewHolder подобном этому

public static String getFormatedSize(Context activityContext, long size) 
    {
        return android.text.format.Formatter.formatShortFileSize(activityContext, size);

    }

но теперь я хочу сохранить предопределенный размер, пожалуйста, помогите мне.

EDIT: почему вы, ребята, голосуете, если внимательно читаете мой вопрос, я просто хочу сохранить размер изображения, а не фактическое изображение, например, размер изображения - 1 МБ, я просто хочу сохранить размер не фактического изображения, поэтому, пожалуйста, остановите голосование

  • 2
    Это плохой подход для сохранения изображений в базе данных ... Лучше всего было бы сохранить путь к изображению в sqlite и получить путь и отобразить изображение
  • 0
    я просто хочу сохранить размер файла, а не фактическое изображение: / внимательно прочитайте мой вопрос
Теги:
database-performance
android-recyclerview
android-database

1 ответ

1
Лучший ответ

Как правило, хранение чисел в отличие от текста лучше/эффективнее.

1) Число, скорее всего, займет меньше места, учитывая: -

INTEGER. Значение представляет собой целое число со знаком, сохраненное в 1, 2, 3, 4, 6 или 8 байтах в зависимости от величины значения. Типы данных В SQLite версии 3

  • 8 байтов - довольно большое количество. Вероятно, вы должны сохранить как длинный и использовать метод курсора getLong если вам нужно извлечь значение для численных целей.

2) Числа, вероятно, будут более гибкими и более удобными для сортировки и сравнения.

  • например, как сортировать 1 МБ, 1 КБ и 1 ГБ?

Вы можете легко преобразовать число в форматированную строку: -

Предположим, что таблица с именем filesizes (столбец с именем filesize): - Изображение 164920

Затем :-

SELECT 
CASE 
    WHEN filesize < 1024 THEN filesize || 'B'
    WHEN filesize >=  1024 AND filesize < (1024 * 1024) THEN (filesize / 1024) || 'KB'
    WHEN filesize >= (1024 * 1024)  AND filesize < (1024 * 1024 * 1024) THEN (filesize / (1024 * 1024)) || 'MB'
    WHEN filesize >= (1024 * 1024 * 1024) AND filesize < (1024 * 1024 * 1024 *1024) THEN (filesize / (1024 * 1024 * 1024)) || 'GB'
    WHEN filesize >= (1024 * 1024 * 1024 * 1024) THEN (filesize / (1024 * 1024 * 1024 * 1024)) || 'TB'
END AS size
FROM filesizes

Это приведет к: -

Изображение 164921

Ниже приведен результат в значениях до 2 десятичных точек (очевидно, не байтов): -

SELECT 
CASE 
    WHEN filesize < 1024 THEN filesize || 'B'
    WHEN filesize >=  1024 AND filesize < (1024 * 1024) THEN ROUND((CAST(filesize AS REAL) / 1024),2) || 'KB'
    WHEN filesize >= (1024 * 1024)  AND filesize < (1024 * 1024 * 1024) THEN ROUND((CAST(filesize AS REAL) / (1024 * 1024)),2) || 'MB'
    WHEN filesize >= (1024 * 1024 * 1024) AND filesize < (1024 * 1024 * 1024 *1024) THEN ROUND((CAST(filesize AS REAL) / (1024 * 1024 * 1024)),2) || 'GB'
    WHEN filesize >= (1024 * 1024 * 1024 * 1024) THEN ROUND((CAST(filesize AS REAL) / (1024 * 1024 * 1024 * 1024)),2) || 'TB'
END AS size
FROM filesizes

согласно :-

Изображение 164922

Конечно, недостатки: -?????

Простой пример Android: -

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper {
    public static final String DBNAME = "ifs";
    public static final int DBVERSION = 1;
    public static final String TBNAME = "imageinfo";
    public static final String IITABLE_ID_COL = BaseColumns._ID;
    public static final String IITABLE_IMAGENAME_COL = "image_name";
    public static final String IITABLE_IMAGESIZE_COL = "image_filesize";
    public static final String IITABLE_FORMATTED_COL = "size";
    SQLiteDatabase mDB;

    public DatabaseHelper(Context context) {
        super(context, DBNAME, null, DBVERSION);
        mDB = this.getWritableDatabase();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String crtsql = "CREATE TABLE IF NOT EXISTS " +
                TBNAME + "(" +
                IITABLE_ID_COL + "INTEGER PRIMARY KEY, " +
                IITABLE_IMAGENAME_COL + " TEXT, " +
                IITABLE_IMAGESIZE_COL + " INTEGER" +
                ")";
        db.execSQL(crtsql);
    }

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

    }

    public long insertRow(String imagename, long filesize) {
        ContentValues cv = new ContentValues();
        cv.put(IITABLE_IMAGENAME_COL,imagename);
        cv.put(IITABLE_IMAGESIZE_COL,filesize);
        return mDB.insert(TBNAME,null,cv);
    }
    /*
        SELECT filesize,
        CASE
            WHEN filesize < 1024 THEN filesize|| 'B'
            WHEN filesize >= 1024 AND filesize < 1048576  THEN ROUND((CAST(filesize AS REAL) / 1024),2) || 'KB'
            WHEN filesize >= 1028576  AND filesize < 1073741824 THEN ROUND((CAST(filesize AS REAL) / 1028576),2) || 'MB'
            WHEN filesize >= 1073741824 AND filesize < 1099511627776 THEN  ROUND((CAST(filesize AS REAL) /1073741824 ),2) || 'GB'
            WHEN filesize >= 1099511627776 THEN ROUND((CAST(filesize AS REAL) /1099511627776 ),2) || 'TB'
        END AS size
        FROM filesizes
     */
    public Cursor getFormattedImageList() {
        long kilobytes = 1024,
                megabytes = kilobytes * kilobytes,
                gigabytes = megabytes * kilobytes,
                terabytes = gigabytes * kilobytes;
        String formatted_column = "CASE" +
                // Bytes
                " WHEN " + IITABLE_IMAGESIZE_COL + " < " + kilobytes +
                " THEN " + IITABLE_IMAGESIZE_COL + " || 'B'" +

                // Kilobytes
                " WHEN " + IITABLE_IMAGESIZE_COL + ">= " + kilobytes +
                " AND " + IITABLE_IMAGESIZE_COL + " < " + megabytes +
                " THEN ROUND((CAST(" +
                IITABLE_IMAGESIZE_COL + " AS REAL) / " + kilobytes + "),2) || 'KB'" +

                // MegaBytes
                " WHEN " + IITABLE_IMAGESIZE_COL + ">= " + megabytes +
                " AND " + IITABLE_IMAGESIZE_COL + " < " + gigabytes +
                " THEN ROUND((CAST(" +
                IITABLE_IMAGESIZE_COL + " AS REAL) / " + megabytes + "),2) || 'MB'" +

                // GigaBytes
                " WHEN " + IITABLE_IMAGESIZE_COL + ">= " + gigabytes +
                " AND " + IITABLE_IMAGESIZE_COL + " < " + terabytes +
                " THEN ROUND((CAST(" +
                IITABLE_IMAGESIZE_COL + " AS REAL) / " + gigabytes + "),2) || 'GB'" +

                // Terabytes
                " WHEN " + IITABLE_IMAGESIZE_COL + ">= " + terabytes +
                " THEN ROUND((CAST(" +
                IITABLE_IMAGESIZE_COL + " AS REAL) / " + terabytes + "),2) || 'TB'" +

                " END AS " + IITABLE_FORMATTED_COL;
        Log.d("SQLCASE",formatted_column);
        String[] columns = new String[]{IITABLE_IMAGENAME_COL,formatted_column,IITABLE_IMAGESIZE_COL};
        return mDB.query(TBNAME,columns,null,null,null,null,IITABLE_IMAGENAME_COL);
    }
}

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // Instantiate the Database Helper
        DatabaseHelper mDBHlpr = new DatabaseHelper(this);
        // Add some rows to the imageinfo table
        mDBHlpr.insertRow("The Church",432567L);
        mDBHlpr.insertRow("The Shop", 200L);
        mDBHlpr.insertRow("The Green", 123456789L);
        mDBHlpr.insertRow("The Petrol Station", (1024L * 1024L * 1024L) + 24L);
        mDBHlpr.insertRow("The House", 1234567890104444440L);

        // Extract a formatted list
        Cursor csr = mDBHlpr.getFormattedImageList();
        while (csr.moveToNext()) {
            Log.d("IMAGES",
                    "Image is " +
                            csr.getString(
                                    csr.getColumnIndex(
                                            DatabaseHelper
                                                    .IITABLE_IMAGENAME_COL
                                    )
                            ) +
                            " Size is " +
                            csr.getString(
                                    csr.getColumnIndex(
                                            DatabaseHelper
                                                    .IITABLE_FORMATTED_COL
                                    )
                            ) +
                            " (" +
                            String.valueOf(
                                    csr.getLong(
                                            csr.getColumnIndex(
                                                    DatabaseHelper
                                                            .IITABLE_IMAGESIZE_COL
                                            ))) +
                            ")"
            );
        }
        csr.close();
    }
}

Выход в журнал: -

01-10 21:57:36.552 2619-2619/? D/SQLCASE: CASE WHEN image_filesize < 1024 THEN image_filesize || 'B' WHEN image_filesize>= 1024 AND image_filesize < 1048576 THEN ROUND((CAST(image_filesize AS REAL) / 1024),2) || 'KB' WHEN image_filesize>= 1048576 AND image_filesize < 1073741824 THEN ROUND((CAST(image_filesize AS REAL) / 1048576),2) || 'MB' WHEN image_filesize>= 1073741824 AND image_filesize < 1099511627776 THEN ROUND((CAST(image_filesize AS REAL) / 1073741824),2) || 'GB' WHEN image_filesize>= 1099511627776 THEN ROUND((CAST(image_filesize AS REAL) / 1099511627776),2) || 'TB' END AS size
01-10 21:57:36.552 2619-2619/? D/IMAGES: Image is The Church Size is 422.43KB (432567)
01-10 21:57:36.552 2619-2619/? D/IMAGES: Image is The Green Size is 117.74MB (123456789)
01-10 21:57:36.552 2619-2619/? D/IMAGES: Image is The House Size is 1122832.96TB (1234567890104444440)
01-10 21:57:36.552 2619-2619/? D/IMAGES: Image is The Petrol Station Size is 1.0GB (1073741848)
01-10 21:57:36.552 2619-2619/? D/IMAGES: Image is The Shop Size is 200B (200)
  • 0
    Устранение неоднозначности: изменение dp на decimal points , чтобы избежать путаницы с density-independent pixels
  • 0
    так что, по вашему мнению, я должен сохранить размер в целое и в байтовом формате, но, пожалуйста, вы можете дать мне запрос на sqlite, как я могу сделать запрос, как это в Android sqlite?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню