在 SQLite 中存储文件大小的最佳方式
Best way to store a file size in SQLite
我正在使用 RecyclerView
开发图库应用程序,对于每张图片,我想将图片大小存储在数据库中,但我无法弄清楚哪种是在数据库中存储大小的最佳方式,我应该选择像“这样的字符串2.5 KB" "500 MB" 或以 Mb 或字节为单位的实数,请指导我哪种方法的读写性能最好
目前我在 RecyclerView
中获取运行时的文件大小
onBindViewHolder
这样的方法
public static String getFormatedSize(Context activityContext, long size)
{
return android.text.format.Formatter.formatShortFileSize(activityContext, size);
}
但现在我想存储预定义的大小请指导我。
编辑:
如果你仔细阅读我的问题,你们为什么要投票我只想存储图像的大小而不是实际图像例如图像大小是 1MB 我只想存储大小而不是实际图像所以请停止投票
通常存储数字而不是文本是 better/more 高效的。
1) 考虑到:-
,一个数字可能会占用更少的存储空间
INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8
bytes depending on the magnitude of the value.
Datatypes In SQLite Version 3
- 8 字节是一个相当大的数字。如果您需要为数字目的提取值,您可能应该保存为 long 并使用 Cursor 的
getLong
方法。
2) 数字可能会更灵活,更容易排序和比较。
- 例如1MB、1KB 和 1GB 将如何排序?
您可以轻松地将数字转换为格式化的字符串 :-
假设一个 table 命名的文件大小是(列名为文件大小):-
然后:-
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
会导致:-
以下将提供 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
根据 :-
当然缺点是:- ??????
简单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)
我正在使用 RecyclerView
开发图库应用程序,对于每张图片,我想将图片大小存储在数据库中,但我无法弄清楚哪种是在数据库中存储大小的最佳方式,我应该选择像“这样的字符串2.5 KB" "500 MB" 或以 Mb 或字节为单位的实数,请指导我哪种方法的读写性能最好
目前我在 RecyclerView
中获取运行时的文件大小
onBindViewHolder
这样的方法
public static String getFormatedSize(Context activityContext, long size)
{
return android.text.format.Formatter.formatShortFileSize(activityContext, size);
}
但现在我想存储预定义的大小请指导我。
编辑: 如果你仔细阅读我的问题,你们为什么要投票我只想存储图像的大小而不是实际图像例如图像大小是 1MB 我只想存储大小而不是实际图像所以请停止投票
通常存储数字而不是文本是 better/more 高效的。
1) 考虑到:-
,一个数字可能会占用更少的存储空间INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value. Datatypes In SQLite Version 3
- 8 字节是一个相当大的数字。如果您需要为数字目的提取值,您可能应该保存为 long 并使用 Cursor 的
getLong
方法。
2) 数字可能会更灵活,更容易排序和比较。
- 例如1MB、1KB 和 1GB 将如何排序?
您可以轻松地将数字转换为格式化的字符串 :-
假设一个 table 命名的文件大小是(列名为文件大小):-
然后:-
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
会导致:-
以下将提供 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
根据 :-
当然缺点是:- ??????
简单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)