Android SQLite Проблема: сбой программы при попытке запроса! - PullRequest
1 голос
/ 18 мая 2010

Привет у меня проблема программирования с Android SDK 1.6. Я делаю то же самое с «блокнотом exaple», но сбой программы при попытке выполнить какой-либо запрос. Если я попытаюсь сделать запрос непосредственно в метод DatabaseHelper create (), он уйдет, но из этой функции он не выйдет У вас есть идеи?

это источник: public class DbAdapter {</p> <pre><code>public static final String KEY_NAME = "name"; public static final String KEY_TOT_DAYS = "totdays"; public static final String KEY_ROWID = "_id"; private static final String TAG = "DbAdapter"; private DatabaseHelper mDbHelper; private SQLiteDatabase mDb; private static final String DATABASE_NAME = "flowratedb"; private static final String DATABASE_TABLE = "girl_data"; private static final String DATABASE_TABLE_2 = "girl_cyle"; private static final int DATABASE_VERSION = 2; /** * Database creation sql statement */ private static final String DATABASE_CREATE = "create table "+DATABASE_TABLE+" (id integer, name text not null, totdays int);"; private static final String DATABASE_CREATE_2 = "create table "+DATABASE_TABLE_2+" (ref_id integer, day long not null);"; private final Context mCtx; private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_CREATE); db.execSQL(DATABASE_CREATE_2); db.delete(DATABASE_TABLE, null, null); db.delete(DATABASE_TABLE_2, null, null); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE); db.execSQL("DROP TABLE IF EXISTS "+DATABASE_TABLE_2); onCreate(db); } } public DbAdapter(Context ctx) { this.mCtx = ctx; } public DbAdapter open() throws SQLException { mDbHelper = new DatabaseHelper(mCtx); mDb = mDbHelper.getWritableDatabase(); return this; } public void close() { mDbHelper.close(); } public long createGirl(int id,String name, int totdays) { ContentValues initialValues = new ContentValues(); initialValues.put(KEY_ROWID, id); initialValues.put(KEY_NAME, name); initialValues.put(KEY_TOT_DAYS, totdays); return mDb.insert(DATABASE_TABLE, null, initialValues); } public long createGirl_fd_day(int refid, long fd) { ContentValues initialValues = new ContentValues(); initialValues.put("ref_id", refid); initialValues.put("calendar", fd); return mDb.insert(DATABASE_TABLE, null, initialValues); } public boolean updateGirl(int rowId, String name, int totdays) { ContentValues args = new ContentValues(); args.put(KEY_NAME, name); args.put(KEY_TOT_DAYS, totdays); return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; } public boolean deleteGirlsData() { if (mDb.delete(DATABASE_TABLE_2, null, null)>0) if(mDb.delete(DATABASE_TABLE, null, null)>0) return true; return false; } public Bundle fetchAllGirls() { Bundle extras = new Bundle(); Cursor cur = mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, KEY_TOT_DAYS}, null, null, null, null, null); cur.moveToFirst(); int tot = cur.getCount(); extras.putInt("tot", tot); int index; for (int i=0;i<tot;i++){ index=cur.getInt(cur.getColumnIndex("_id")); extras.putString("name"+index, cur.getString(cur.getColumnIndex("name"))); extras.putInt("totdays"+index, cur.getInt(cur.getColumnIndex("totdays"))); } cur.close(); return extras; } public Cursor fetchGirl(int rowId) throws SQLException { Cursor mCursor = mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME, KEY_TOT_DAYS}, KEY_ROWID + "=" + rowId, null, null, null, null, null); if (mCursor != null) { mCursor.moveToFirst(); } return mCursor; } public Cursor fetchGirlCD(int rowId) throws SQLException { Cursor mCursor = mDb.query(true, DATABASE_TABLE_2, new String[] {"ref_id", "day"}, "ref_id=" + rowId, null, null, null, null, null); if (mCursor != null) { mCursor.moveToFirst(); } return mCursor; }

}

Танк Валерио из Италии:)

Ответы [ 4 ]

2 голосов
/ 22 марта 2011

У меня была такая же проблема. Даже после того, как весь код извлекался из кода, запрос все еще падал.

Я изменил имя БД, и оно начало работать.

Я подозреваю, что, поскольку я не перезапускал свой эмулятор с момента тестирования более ранних итераций «плохого» кода, экземпляр БД заклинило в одном из прогонов.

2 голосов
/ 18 мая 2010

У меня еще не было возможности проверить свою теорию, но похоже, что "DATABASE_CREATE" определяет "id", а вы получаете "_id" в своих запросах. Вы определяете "KEY_ROWID" сверху, но не используете эту константу в запросе на создание БД.

Однако, если это была ваша основная проблема, я не знаю, почему: «Если я пытаюсь сделать запрос напрямую в метод DatabaseHelper create (), он идет, но из этой функции это не так».

Надеюсь, это поможет.

1 голос
/ 30 июня 2010

У меня была такая же проблема, я решил ее, посмотрев на ваш комментарий о создании новой базы данных.

Метод onCreate () вызывается только при создании базы данных. Если база данных уже создана (она создается при первой попытке кода :), onCreate не будет вызываться при следующем запуске эмулятора. поэтому изменение оператора sql в методе onCreate () не изменит таблицу при следующем запуске эмулятора, и у вас останется таблица, созданная при первом запуске эмулятора и создании базы данных. с этим сценарием у вас будут неправильные операторы SQL в вашем коде. Второй сценарий - использование консольной программы (оболочки) adb-sqlite3 и изменение таблиц. База данных уже создана, поэтому onCreate () вызываться не будет - и независимо от того, какой код вы должны описать в своей таблице, onCreate () таблица будет такой же, как вы изменили ее через shell ...

Моя проблема заключалась в том, что я удалил таблицы, используя оболочку, и ожидал, что onCreate создаст их заново, но база данных уже была создана и больше не имела таблиц.

Итак, вывод заключается в том, что при первом создании базы данных создаются все таблицы, и, если вам нужно изменить их, измените их через shell или удалите базу данных, чтобы onCreate вызывался только при запуске вашей программы. .

Черт возьми, этот текст звучит как бесконечный цикл :) извините за усложнение ответа, я действительно очень многоуровневый уже ...: (

удачи!

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

В общем, обработка ошибок невелика. Есть несколько мест, где я вижу, что код может дать сбой.

Для начала, окружите эти вещи трикотажем

  • ParseInt ()
  • Выполнение запросов, вставок, обновлений,

Также:

  • Перед вызовом метода close () убедитесь, что переменная mDB не равна нулю.
  • getcolumnIndex - если вы используете это, запрашивайте ваши записи в нужном вам порядке, тогда вы будете знать, в каком индексе находится каждое поле. Например: SELECT id,name from table тогда вы можете получить доступ к имени с помощью getString (1);

И самое главное, ознакомьтесь с adb logcat (ссылка ниже). Этот инструмент извлечет буфер журнала из вашего устройства и отслеживает его в режиме реального времени на предмет сбоев.

Если ваше приложение дает сбой, adb + logcat покажет вам трассировку стека, которая укажет точную строку, где произошло сбой вашего приложения, и почему!

https://developer.android.com/studio/command-line/adb.html#logcat

...