Android SQLiteDB不';我无法完成添加值
我的SQLiteDatabase给我带来了一些麻烦。当用户关闭应用程序时,在onPause()中,一个异步任务开始保存数据。我不知道这是否是最好的方法,但我的方法是,首先数据库删除所有现有数据(不太多,两个表之间可能有20-30个值),然后将新数据添加回数据库 deleteAll()方法工作得很好,但当它尝试添加每个项时,在第六个项之后失败 这是AsyncTask的doInBackground()方法:Android SQLiteDB不';我无法完成添加值,android,android-sqlite,Android,Android Sqlite,我的SQLiteDatabase给我带来了一些麻烦。当用户关闭应用程序时,在onPause()中,一个异步任务开始保存数据。我不知道这是否是最好的方法,但我的方法是,首先数据库删除所有现有数据(不太多,两个表之间可能有20-30个值),然后将新数据添加回数据库 deleteAll()方法工作得很好,但当它尝试添加每个项时,在第六个项之后失败 这是AsyncTask的doInBackground()方法: @Override protected Void doInBackground(Vo
@Override
protected Void doInBackground(Void... args)
{
//open database
try
{
myDbHelper.openDatabase();
}catch(SQLException sqle)
{
throw sqle;
}
myDbHelper.deleteAll();
//add all ingredients & units
for (int i = 0; i < ingredients.size(); i++)
myDbHelper.addIngredient(ingredients.get(i));
for (int i = 0; i < units.size(); i++)
myDbHelper.addUnit(units.get(i));
myDbHelper.close();
return null;
}
最后,这是日志。如您所见,它突然结束,只调用了AddingCredit()六次。还有showStatusIcon警告,但我不知道这可能是从哪里来的,或者是什么原因造成的
02-13 18:47:32.320: D/QBCPro:::(25264): SaveAllTask: Saving to database...
02-13 18:47:32.405: W/IInputConnectionWrapper(25264): showStatusIcon on inactive InputConnection
02-13 18:47:32.445: D/QBCPro(25264): DatabaseHelper deleteAll() called.
02-13 18:47:32.480: D/QBCPro(25264): 11 ingredients deleted successfully
02-13 18:47:32.510: D/QBCPro(25264): 12 units deleted successfully
02-13 18:47:32.510: D/QBCPro(25264): Leaving DatabaseHelper deleteAll() method.
02-13 18:47:32.540: D/QBCPro(25264): Successfully inserted almonds (ground) into row 1
02-13 18:47:32.575: D/QBCPro(25264): Successfully inserted baking powder into row 2
02-13 18:47:32.610: D/QBCPro(25264): Successfully inserted baking soda into row 3
02-13 18:47:32.640: D/QBCPro(25264): Successfully inserted butter into row 4
02-13 18:47:32.685: D/QBCPro(25264): Successfully inserted cocoa powder into row 5
02-13 18:47:32.720: D/QBCPro(25264): Successfully inserted flour (all-purp) into row 6
我猜这会导致内存泄漏之类的,因为这是日志的结尾。它也会导致应用程序崩溃,因为当我把它带回到前台时,会收到一堆IInputConnection警告,而我所有的视图都是不可见的
如有任何见解,将不胜感激
更新:
它无缘无故地停止了,但它又开始了。我没有更改数据库中的任何代码(除了日志语句),但是我在主活动中做了一些更改,但是它不应该对数据库有任何影响。下面是发生的情况:
用户退出应用程序,调用AsyncTask SaveAllTask。代码与上面相同,但我添加了一些日志语句,如您所见:
02-14 13:41:29.561: D/QBCPro:::(12104): SaveAllTask doInBackground called...
02-14 13:41:29.561: D/QBCPro:::(12104): SaveAllTask: ingredients.size() = 11
02-14 13:41:29.576: D/QBCPro:::(12104): SaveAllTask: units.size() = 12
02-14 13:41:29.616: D/QBCPro:::(12104): SaveAllTask: Saving to database...
02-14 13:41:29.671: W/IInputConnectionWrapper(12104): showStatusIcon on inactive InputConnection
02-14 13:41:29.701: D/QBCPro(12104): DatabaseHelper deleteAll() called.
02-14 13:41:29.736: D/QBCPro(12104): 11 ingredients deleted successfully
02-14 13:41:29.761: D/QBCPro(12104): 12 units deleted successfully
02-14 13:41:29.761: D/QBCPro(12104): Leaving DatabaseHelper deleteAll() method.
02-14 13:41:29.781: D/QBCPro(12104): Successfully inserted almonds (ground) into row 1
02-14 13:41:29.811: D/QBCPro(12104): Successfully inserted baking powder into row 2
02-14 13:41:29.836: D/QBCPro(12104): Successfully inserted baking soda into row 3
02-14 13:41:29.861: D/QBCPro(12104): Successfully inserted butter into row 4
02-14 13:41:29.886: D/QBCPro(12104): Successfully inserted cocoa powder into row 5
02-14 13:41:29.921: D/QBCPro(12104): Successfully inserted flour (all-purp) into row 6
02-14 13:41:29.961: D/QBCPro(12104): Successfully inserted flour (cake) into row 7
02-14 13:41:29.991: D/QBCPro(12104): Successfully inserted milk (2%) into row 8
02-14 13:41:30.021: D/QBCPro(12104): Successfully inserted sugar (br, packed) into row 9
然后它像上面一样突然结束,虽然奇怪的是在第9行而不是第6行。将应用程序带回前台将调用AsyncTask LoadAllTask,从而导致:
02-14 13:43:57.106: D/QBCPro:::(12532): LoadAllTask doInBackground called...
02-14 13:43:57.121: D/QBCPro:::(12532): LoadAllTask: ingredients.size() == 9
02-14 13:43:57.121: D/QBCPro:::(12532): LoadAllTask: units.size() == 0
02-14 13:43:57.121: D/QBCPro(12532): Database CLOSED! (good thing)
02-14 13:43:57.121: D/QBCPro:::(12532): LoadAllTask doInBackground completed...
我的应用程序坏了
我认为没有必要,但以防万一,以下是我的LoadAllTask代码:
@Override
protected Void doInBackground(Void... params)
{
Log.d(TAG, "LoadAllTask doInBackground called...");
//open database
try
{
myDbHelper.openDatabase();
}catch(SQLException sqle)
{
throw sqle;
}
//get all ingredients and units
ingredients = myDbHelper.getAllIngredients();
units = myDbHelper.getAllUnits();
Log.d(TAG, "LoadAllTask: ingredients.size() == " + ingredients.size());
Log.d(TAG, "LoadAllTask: units.size() == " + units.size());
myDbHelper.close();
Log.d(TAG, "LoadAllTask doInBackground completed...");
return null;
}
我通过创建一个包含AsyncTask的IntentService,并在onPause中调用它,解决了这个问题。它现在工作无误。以下是onPause中的代码:
Intent saveIntent = new Intent(this, SaveService.class);
startService(saveIntent);
下面是我的SaveService类:
public class SaveService extends IntentService
{
private ArrayList<Ingredient> ingredientsArray;
private ArrayList<Unit> unitsArray;
private DatabaseHelper dbHelper;
public SaveService(String name)
{
super(name);
}
public SaveService()
{
super("SaveService");
}
@Override
protected void onHandleIntent(Intent intent)
{
//save data to database
dbHelper = new DatabaseHelper(getApplicationContext());
ingredientsArray = QuickBakeConverterPro.ingredients;
unitsArray = QuickBakeConverterPro.units;
new SaveAllTask().execute();
}
private class SaveAllTask extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... args)
{
//open database
try
{
dbHelper.openDatabase();
}catch(SQLException sqle)
{
throw sqle;
}
dbHelper.deleteAll();
//add all ingredients & units
for (int i = 0; i < ingredientsArray.size(); i++)
dbHelper.addIngredient(ingredientsArray.get(i));
for (int i = 0; i < unitsArray.size(); i++)
dbHelper.addUnit(unitsArray.get(i));
dbHelper.close();
return null;
}
}//SaveAllTask
}//class SaveService
公共类存储服务扩展了IntentService
{
private ArrayList Ingredintsarray;
私人ArrayList unitsArray;
私有数据库助手dbHelper;
公共存储服务(字符串名称)
{
超级(姓名);
}
公共储蓄服务()
{
超级(“储蓄服务”);
}
@凌驾
受保护的手部内容无效(意图)
{
//将数据保存到数据库
dbHelper=newdatabasehelper(getApplicationContext());
ingredientsArray=快速烘焙转换成分;
unitsArray=QuickBakeConverterPro.units;
新建SaveAllTask().execute();
}
私有类SaveAllTask扩展了AsyncTask
{
@凌驾
受保护的Void doInBackground(Void…args)
{
//开放数据库
尝试
{
dbHelper.openDatabase();
}捕获(SQLException sqle)
{
抛出sqle;
}
dbHelper.deleteAll();
//添加所有成分和单位
对于(int i=0;i
您是否仔细检查了成分中有多少项?如果有问题,通常会有例外…这很奇怪。。。除了为components.size()和units.size()添加一个log语句外,我并没有改变我的代码,到目前为止,它每次都能完美地工作。我要做更多的测试,因为我绝对不相信它。唯一的另一个区别是,从昨天开始,我重新启动了我的计算机(因此也重新启动了Eclipse)和测试设备。也许是我的设备出了问题,重启它有帮助吗?好吧,这一切又莫名其妙地再次发生了。我将用更多的信息更新原始帖子。有例外吗?没有,唯一类似例外的是IIInputConnectionWrapper。原木在那个配料处停了下来。此外,onPostExecuted()从未被调用,因为我也在其中放入了日志语句。事实上,在doInBackground()的末尾,我在那里放了一个从未被调用过的语句。
public class SaveService extends IntentService
{
private ArrayList<Ingredient> ingredientsArray;
private ArrayList<Unit> unitsArray;
private DatabaseHelper dbHelper;
public SaveService(String name)
{
super(name);
}
public SaveService()
{
super("SaveService");
}
@Override
protected void onHandleIntent(Intent intent)
{
//save data to database
dbHelper = new DatabaseHelper(getApplicationContext());
ingredientsArray = QuickBakeConverterPro.ingredients;
unitsArray = QuickBakeConverterPro.units;
new SaveAllTask().execute();
}
private class SaveAllTask extends AsyncTask<Void, Void, Void>
{
@Override
protected Void doInBackground(Void... args)
{
//open database
try
{
dbHelper.openDatabase();
}catch(SQLException sqle)
{
throw sqle;
}
dbHelper.deleteAll();
//add all ingredients & units
for (int i = 0; i < ingredientsArray.size(); i++)
dbHelper.addIngredient(ingredientsArray.get(i));
for (int i = 0; i < unitsArray.size(); i++)
dbHelper.addUnit(unitsArray.get(i));
dbHelper.close();
return null;
}
}//SaveAllTask
}//class SaveService