Как найти объем памяти (размер) определенного столбца с типом TEXT или VARCHAR в базе данных SQLite в Android? - PullRequest
0 голосов
/ 18 мая 2019

Я создаю приложение для заметок на базе Android.Я хочу показать размер заметки пользователю в моем приложении.Я знаю, что размер файла и изображения легко определить в sqlite, но здесь я хочу получить размер или объем памяти, занимаемый столбцами заголовка и описания, которые имеют типы данных TEXT и VARCHAR в байтах.Одна строка в таблице базы данных представляет одну заметку в моем случае.

Я перепробовал все возможные решения с функциями «Длина» и «МАКС», но тщетно.Я использовал подготовленный оператор sqlite для этой цели, но не могу получить размер столбца с определенным идентификатором.Вот мой код:

public class DataAdapterText
{
Context c;
    SQLiteDatabase db;
    DBHelperText helper;

    public DataAdapterText(Context c) {
        this.c = c;
        helper=new DBHelperText(c);
    }
public void getSize(int id)
{

    SQLiteStatement byteStatement = db.compileStatement("SELECT LENGTH(txtitle) FROM TX_Table WHERE tid='"+id+"'");
    long bytes = byteStatement.simpleQueryForLong();

    long kilobytes = 1024,
            megabytes = kilobytes * kilobytes,
            gigabytes = megabytes * kilobytes,
            terabytes = gigabytes * kilobytes;
if (bytes<kilobytes)
{
    Toast.makeText(c, bytes+" B", Toast.LENGTH_SHORT).show();
}
else if (bytes>=kilobytes && bytes<megabytes)
{
    Toast.makeText(c, bytes+" KB", Toast.LENGTH_SHORT).show();
}
else if (bytes>=megabytes && bytes<gigabytes)
{
    Toast.makeText(c, bytes+" MB", Toast.LENGTH_SHORT).show();
}
else if (bytes>=gigabytes && bytes<terabytes)
{
    Toast.makeText(c, bytes+" GB", Toast.LENGTH_SHORT).show();
}

}
}


public class TextNotes extends AppCompatActivity
{
   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_text_notes);
 DataAdapterText dataAdapterText=new DataAdapterText(TextNotes.this);
        dataAdapterText.openDB();
        dataAdapterText.getSize(Id);//here Id is the ID of specific item when clicked by the user and is coming from the Recycler adapter. No issue with this ID!
        dataAdapterText.closeDB();
}

Без предложения WHERE в инструкции SELECT выше, этот код работает без ошибок.Но так как мне нужна длина столбца с определенным идентификатором, мне нужно предложение WHERE, но оно дает ошибку с предложением WHERE.Если есть какой-либо другой способ решить эту проблему и получить размер заметок, пожалуйста, направьте меня.Вот логкат ошибки:

2019-05-18 14:19:25.893 13286-13286/com.example.unifiednotesnew E/asset: AssetManager::addSystemOverlays delete oidmap
2019-05-18 14:19:39.943 13286-13286/com.example.unifiednotesnew E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.unifiednotesnew, PID: 13286
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.unifiednotesnew/com.example.unifiednotesnew.TextNotes}: android.database.sqlite.SQLiteDoneException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2750)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2811)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6316)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762)
     Caused by: android.database.sqlite.SQLiteDoneException
        at android.database.sqlite.SQLiteConnection.nativeExecuteForLong(Native Method)
        at android.database.sqlite.SQLiteConnection.executeForLong(SQLiteConnection.java:604)
        at android.database.sqlite.SQLiteSession.executeForLong(SQLiteSession.java:790)
        at android.database.sqlite.SQLiteStatement.simpleQueryForLong(SQLiteStatement.java:107)
        at com.example.unifiednotesnew.Adapter.DataAdapterText.getSize(DataAdapterText.java:193)
        at com.example.unifiednotesnew.TextNotes.onCreate(TextNotes.java:125)
        at android.app.Activity.performCreate(Activity.java:6757)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2703)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2811) 
        at android.app.ActivityThread.-wrap12(ActivityThread.java) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6316) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:872) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:762) 

1 Ответ

0 голосов
/ 18 мая 2019

Выпуск

Ваша проблема в том, что не было выбрано ни одной строки и нет возвращаемого значения.

То есть: -

SQLiteDoneException

Исключение, которое указывает, что программа SQLite завершена. Брошенный, когда операция, которая ожидает строку (например, SQLiteStatement # simpleQueryForString или SQLiteStatement # simpleQueryForLong), не получает ее.

Исправления

Вы можете перехватить исключение, например,

........
SQLiteStatement byteStatement = db.compileStatement("SELECT LENGTH(txtitle) FROM TX_Table WHERE tid='"+id+"'");
long bytes = 0;
try {
    bytes = byteStatement.simpleQueryForLong();
} catch (SQLiteDoneException e) {

}

long kilobytes = 1024,
........

или получить значения с помощью курсора, например, что-то вроде: -

public long getColumnLengthById(String table, String column, long id, String idcolumn) {
    long rv = 0;
    String rv_column = "LEN";
    String[] columns = new String[]{"length(" + column + ") AS " + rv_column};
    String whereclause = idcolumn + "=?";
    String[] whereargs = new String[]{String.valueOf(id)};
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor csr = db.query(table,columns,whereclause,whereargs,null,null,null);
    while (csr.moveToNext()) {
        rv = rv + csr.getLong(csr.getColumnIndex(rv_column));
    }
    csr.close();
    return rv;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...