Я создаю приложение для заметок на базе 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)