java.lang.OutOfMemoryError: [memory exhausted] while reading data from Sqlite Android
java.lang.OutOfMemoryError: [memory exhausted] while reading data from Sqlite Android
我已成功将数据保存在 SQLite 数据库中。但是我在从我的 SQLite 数据库中读取数据时遇到错误,然后我的应用程序崩溃了。
error message
01-01 05:42:13.916 607-607/com.example.eyesaver I/dalvikvm: | sysTid=607 nice=0 sched=0/0 cgrp=apps handle=68313184
01-01 05:42:13.916 607-607/com.example.eyesaver I/dalvikvm: | sysTid=607 nice=0 sched=0/0 cgrp=apps handle=68313184
01-01 05:42:13.916 607-607/com.example.eyesaver I/dalvikvm: | state=R schedstat=( 0 0 0 ) utm=2910 stm=2910 core=0
01-01 05:42:13.916 607-607/com.example.eyesaver I/dalvikvm: | state=R schedstat=( 0 0 0 ) utm=2910 stm=2910 core=0
01-01 05:42:13.917 607-607/com.example.eyesaver I/dalvikvm: at android.database.CursorWindow.nativeGetString(Native Method)
01-01 05:42:13.917 607-607/com.example.eyesaver I/dalvikvm: at android.database.CursorWindow.nativeGetString(Native Method)
01-01 05:42:13.917 607-607/com.example.eyesaver I/dalvikvm: at android.database.CursorWindow.getString(CursorWindow.java:434)
01-01 05:42:13.917 607-607/com.example.eyesaver I/dalvikvm: at android.database.CursorWindow.getString(CursorWindow.java:434)
01-01 05:42:13.917 607-607/com.example.eyesaver I/dalvikvm: at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
01-01 05:42:13.917 607-607/com.example.eyesaver I/dalvikvm: at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
01-01 05:42:13.917 607-607/com.example.eyesaver I/dalvikvm: at com.example.eyesaver.SQ_Lite_DB.ReadSqliteData(SQ_Lite_DB.java:59)
01-01 05:42:13.917 607-607/com.example.eyesaver I/dalvikvm: at com.example.eyesaver.SQ_Lite_DB.ReadSqliteData(SQ_Lite_DB.java:59)// I marked this line in code
和
1-01 05:42:16.189 607-607/com.example.eyesaver E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.eyesaver, PID: 607
java.lang.OutOfMemoryError: [memory exhausted]
at dalvik.system.NativeStart.main(Native Method)
01-01 05:42:16.189 607-607/com.example.eyesaver E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.eyesaver, PID: 607
java.lang.OutOfMemoryError: [memory exhausted]
at dalvik.system.NativeStart.main(Native Method)
我正在使用 'ReadSqliteData()' 方法从我的 SQLite 中读取数据
ReadSqliteData() method
public void ReadSqliteData(Context context){
ArrayList<Model> list = new ArrayList<>();
Adpter adpter = new Adpter(list,context);
SQLiteDatabase database = getWritableDatabase();
Cursor cursor = database.rawQuery("Select name, image from orders",null);
if (cursor.moveToFirst()){
while (cursor.moveToFirst()){
Model model = new Model();
model.setImage(cursor.getString(0)); //i am getting error here
model.setName(cursor.getString(1)); //i am getting error here
list.add(model);
}
adpter.notifyDataSetChanged();
}
cursor.close();
database.close();
}
还有一个问题:我在SQLite数据库中的id为null,不知道为什么?我正在创建这样的 table
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(
"Create Table orders"+
"(id INTERGER PRIMARY KEY,"+
"image text ,"+
"name text)"
);
}
如果您需要任何其他信息,请告诉我。
尝试使用以下代码。
//update your table create query, id should be auto increment and also your query was not in correct form.
db.execSQL(
"Create Table orders"+
"("+ id INTEGER PRIMARY KEY AUTOINCREMENT,"+
"image text ,"+
"name text" +")"
);
//update you read method code
public void ReadSqliteData(Context context){
ArrayList<Model> list = new ArrayList<>();
Adpter adpter = new Adpter(list,context);
SQLiteDatabase database = getReadableDatabase();
Cursor cursor = database.rawQuery("Select name, image from orders",null);
if (cursor.moveToNext()){
while (cursor.moveToFirst()){
Model model = new Model();
model.setImage(cursor.getString(0));
model.setName(cursor.getString(1));
list.add(model);
}
adpter.notifyDataSetChanged();
}
cursor.close();
database.close();
}
您的循环永远不会结束,因为在每次迭代中您都将游标的索引设置在第一行 moveToFirst()
而没有前进到下一行。
仅使用 moveToNext()
:
public void ReadSqliteData(Context context){
ArrayList<Model> list = new ArrayList<>();
Adpter adpter = new Adpter(list,context);
SQLiteDatabase database = getWritableDatabase();
Cursor cursor = database.rawQuery("Select name, image from orders",null);
while (cursor.moveToNext()){
Model model = new Model();
model.setImage(cursor.getString(0));
model.setName(cursor.getString(1));
list.add(model);
}
adpter.notifyDataSetChanged();
cursor.close();
database.close();
}
我已成功将数据保存在 SQLite 数据库中。但是我在从我的 SQLite 数据库中读取数据时遇到错误,然后我的应用程序崩溃了。
error message
01-01 05:42:13.916 607-607/com.example.eyesaver I/dalvikvm: | sysTid=607 nice=0 sched=0/0 cgrp=apps handle=68313184
01-01 05:42:13.916 607-607/com.example.eyesaver I/dalvikvm: | sysTid=607 nice=0 sched=0/0 cgrp=apps handle=68313184
01-01 05:42:13.916 607-607/com.example.eyesaver I/dalvikvm: | state=R schedstat=( 0 0 0 ) utm=2910 stm=2910 core=0
01-01 05:42:13.916 607-607/com.example.eyesaver I/dalvikvm: | state=R schedstat=( 0 0 0 ) utm=2910 stm=2910 core=0
01-01 05:42:13.917 607-607/com.example.eyesaver I/dalvikvm: at android.database.CursorWindow.nativeGetString(Native Method)
01-01 05:42:13.917 607-607/com.example.eyesaver I/dalvikvm: at android.database.CursorWindow.nativeGetString(Native Method)
01-01 05:42:13.917 607-607/com.example.eyesaver I/dalvikvm: at android.database.CursorWindow.getString(CursorWindow.java:434)
01-01 05:42:13.917 607-607/com.example.eyesaver I/dalvikvm: at android.database.CursorWindow.getString(CursorWindow.java:434)
01-01 05:42:13.917 607-607/com.example.eyesaver I/dalvikvm: at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
01-01 05:42:13.917 607-607/com.example.eyesaver I/dalvikvm: at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
01-01 05:42:13.917 607-607/com.example.eyesaver I/dalvikvm: at com.example.eyesaver.SQ_Lite_DB.ReadSqliteData(SQ_Lite_DB.java:59)
01-01 05:42:13.917 607-607/com.example.eyesaver I/dalvikvm: at com.example.eyesaver.SQ_Lite_DB.ReadSqliteData(SQ_Lite_DB.java:59)// I marked this line in code
和
1-01 05:42:16.189 607-607/com.example.eyesaver E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.eyesaver, PID: 607
java.lang.OutOfMemoryError: [memory exhausted]
at dalvik.system.NativeStart.main(Native Method)
01-01 05:42:16.189 607-607/com.example.eyesaver E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.eyesaver, PID: 607
java.lang.OutOfMemoryError: [memory exhausted]
at dalvik.system.NativeStart.main(Native Method)
我正在使用 'ReadSqliteData()' 方法从我的 SQLite 中读取数据
ReadSqliteData() method
public void ReadSqliteData(Context context){
ArrayList<Model> list = new ArrayList<>();
Adpter adpter = new Adpter(list,context);
SQLiteDatabase database = getWritableDatabase();
Cursor cursor = database.rawQuery("Select name, image from orders",null);
if (cursor.moveToFirst()){
while (cursor.moveToFirst()){
Model model = new Model();
model.setImage(cursor.getString(0)); //i am getting error here
model.setName(cursor.getString(1)); //i am getting error here
list.add(model);
}
adpter.notifyDataSetChanged();
}
cursor.close();
database.close();
}
还有一个问题:我在SQLite数据库中的id为null,不知道为什么?我正在创建这样的 table
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(
"Create Table orders"+
"(id INTERGER PRIMARY KEY,"+
"image text ,"+
"name text)"
);
}
如果您需要任何其他信息,请告诉我。
尝试使用以下代码。
//update your table create query, id should be auto increment and also your query was not in correct form.
db.execSQL(
"Create Table orders"+
"("+ id INTEGER PRIMARY KEY AUTOINCREMENT,"+
"image text ,"+
"name text" +")"
);
//update you read method code
public void ReadSqliteData(Context context){
ArrayList<Model> list = new ArrayList<>();
Adpter adpter = new Adpter(list,context);
SQLiteDatabase database = getReadableDatabase();
Cursor cursor = database.rawQuery("Select name, image from orders",null);
if (cursor.moveToNext()){
while (cursor.moveToFirst()){
Model model = new Model();
model.setImage(cursor.getString(0));
model.setName(cursor.getString(1));
list.add(model);
}
adpter.notifyDataSetChanged();
}
cursor.close();
database.close();
}
您的循环永远不会结束,因为在每次迭代中您都将游标的索引设置在第一行 moveToFirst()
而没有前进到下一行。
仅使用 moveToNext()
:
public void ReadSqliteData(Context context){
ArrayList<Model> list = new ArrayList<>();
Adpter adpter = new Adpter(list,context);
SQLiteDatabase database = getWritableDatabase();
Cursor cursor = database.rawQuery("Select name, image from orders",null);
while (cursor.moveToNext()){
Model model = new Model();
model.setImage(cursor.getString(0));
model.setName(cursor.getString(1));
list.add(model);
}
adpter.notifyDataSetChanged();
cursor.close();
database.close();
}