Вопрос по sqlite, android – SQLiteException: такой таблицы не существует

0

Я пытаюсь создать базу данных SQLite в своем приложении для Android, но мой код постоянно выдает «SQLiteException». говоря, что такой таблицы не существует. Я новичок в SQL, но я предполагаю, что это означает, что мой сценарий создания не работает должным образом. Часть моего кода ниже. Пожалуйста, укажите на любые ошибки, которые вы видите, и спасибо заранее!

адаптер:

<code>public class DBAdapter
{
public static final String KEY_ID = "_id";
public static final String KEY_NAME = "name";
public static final String KEY_FAVORITE = "favorite";
public static final String KEY_LAT = "lat";
public static final String KEY_LONG = "long";
public static final String KEY_ADDRESS = "address";
public static final String KEY_PHONE = "phone";

private static final String TAG = "DBAdapter";
private static final String DATABASE_NAME = "eateries";
private static final String DATABASE_TABLE = "names";
private static final int DATABASE_VERSION = 1;

private static final String DATABASE_CREATE =
        "create table " + DATABASE_TABLE + "( "
        + KEY_ID + " integer primary key autoincrement, "
        + KEY_NAME + " text not null, "
        + KEY_FAVORITE + " integer, "
        + KEY_LAT + " text not null, "
        + KEY_LONG + " text not null, "
        + KEY_ADDRESS + " text not null, "
        + KEY_PHONE + " text not null);";

private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
public DBAdapter(Context ctx)
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}
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);
    }
    @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 names");
        onCreate(db);
    }
}
//---opens the database---
public DBAdapter open() throws SQLException
{
    db = DBHelper.getWritableDatabase();
    return this;
}
//---closes the database---
public void close()
{
    DBHelper.close();
}
//---insert a title into the database---
public long insertNew(String name, Integer favorite, GeoPoint coords, String address, String phone)
{
    ContentValues initialValues = new ContentValues();

    initialValues.put(KEY_NAME, name);
    initialValues.put(KEY_FAVORITE, favorite);
    initialValues.put(KEY_LAT, coords.getLatitudeE6());
    initialValues.put(KEY_LONG, coords.getLongitudeE6());
    initialValues.put(KEY_ADDRESS, address);
    initialValues.put(KEY_PHONE, phone);

    return db.insertOrThrow(DATABASE_TABLE, null, initialValues);
}
</code>

Телефонный код:     пакет bhekman.test.database;

<code>import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

import com.google.android.maps.GeoPoint;

public class DatabaseActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        DBAdapter dba = new DBAdapter(this);
        dba.open();
        dba.insertNew("mc. awesome", 1, new GeoPoint(0, 0), "42 SUPER AWESOME DRIVE", "(616)-994-2421");

        Toast.makeText(this, dba.getName(0).getString(0), Toast.LENGTH_LONG).show();
        dba.close();
    }
}
</code>

Ошибка LogCat:

<code>01-05 22:06:29.030: E/AndroidRuntime(4785): FATAL EXCEPTION: main
01-05 22:06:29.030: E/AndroidRuntime(4785): java.lang.RuntimeException: Unable to start activity ComponentInfo{bhekman.test.database/bhekman.test.database.DatabaseActivity}: android.database.sqlite.SQLiteException: no such table: names: , while compiling: INSERT INTO names(phone, long, favorite, address, lat, name) VALUES(?, ?, ?, ?, ?, ?);
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.os.Looper.loop(Looper.java:130)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.app.ActivityThread.main(ActivityThread.java:3683)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at java.lang.reflect.Method.invokeNative(Native Method)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at java.lang.reflect.Method.invoke(Method.java:507)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at dalvik.system.NativeStart.main(Native Method)
01-05 22:06:29.030: E/AndroidRuntime(4785): Caused by: android.database.sqlite.SQLiteException: no such table: names: , while compiling: INSERT INTO names(phone, long, favorite, address, lat, name) VALUES(?, ?, ?, ?, ?, ?);
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1149)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1569)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.database.sqlite.SQLiteDatabase.insertOrThrow(SQLiteDatabase.java:1452)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at bhekman.test.database.DBAdapter.insertNew(DBAdapter.java:93)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at bhekman.test.database.DatabaseActivity.onCreate(DatabaseActivity.java:18)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
01-05 22:06:29.030: E/AndroidRuntime(4785):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
01-05 22:06:29.030: E/AndroidRuntime(4785):     ... 11 more
</code>
Был добавлен. bhekman
пожалуйста, вставьте новый метод. Changwei Yao
просто выдать ошибку sqlite при сбое запроса и прочитать ошибку. Вам придется делать это целый день навсегда и всегда, так что вы можете начать прямо сейчас. Buttle Butkus

Ваш Ответ

2   ответа
4

Он отлично работает на моем компьютере с вашим кодом. поэтому я предполагаю, что вы меняете имя TABLE во время разработки. и просто запустите программу снова с помощью команды RUN eclipse. Таким образом, приложение не было новой установкой. но вы не реализуете onUpgrade () правильно.

чтобы решить вашу проблему вы встретились быстро.

  1. uninstall the program with adb uninstall
  2. reinstall the program.
Добавлен код вызова и трассировка logcat. bhekman
О, мой плохой. Хорошая точка зрения. Тем не менее, код выдает ту же ошибку, если я заменяю «бит» с "целым числом". bhekman
Я попробовал это & # x2014; без кости Список типов данных здесь:tizag.com/sqlTutorial/sqldatatypes.php bhekman
sqlite.org/datatype3.html   SQlite имеет некоторую разницу с SQL
Можете ли вы опубликовать больше кодов. В частности, метод выполняет операцию вставки.
0

Вносили ли вы изменения в таблицу после ее первоначального создания (то есть запускаете ее на своем телефоне / эмуляторе)? Например, можно добавить новую таблицу или изменить ее название?

Если это так, вам нужно изменитьDATABASE_VERSION до 2, чтобы база данных была обновлена до вашей последней схемы.

А такжеKEY_FAVORITE + " bit, " должно бытьKEY_FAVORITE + " integer, ", И если вы сделаете это изменение, вам также необходимо обновить DATABASE_VERSION.

В основном дляanything это вносит изменения в структуру базы данных, вам нужно увеличить версию, чтобы база данных воссоздала базу данных с вашими новыми изменениями.

Я переключился на целое число, основываясь на ответе Чанвэя. Не обновляет ли мне управление версиями для меня? bhekman
Единственные сделанные изменения - те, которые показаны в коде вызова, который я добавил выше. Я не думаю, что они требуют изменения версии, но скажите мне, если я ошибаюсь. bhekman
Я переопределил метод onUpdate, я просто не опубликовал его. Я добавлю это. Управляет ли этот код управлением версиями или управление версиями вручную (нужно ли мне увеличивать версию самостоятельно, если да, то как?)? bhekman
OnUpdate позаботится об этом (если вы его настроили) после того, как вы сообщите ему о новой версии, изменивprivate static final int DATABASE_VERSION = 1; вprivate static final int DATABASE_VERSION = 2; (или каким бы ни был соответствующий номер следующей редакции).
Честно говоря, это быстро, и я все равно попытаюсь изменить номер версии и посмотреть, что произойдет, потому что я не вижу ничего плохого, хотя просмотр вашего метода insertNew может помочь в диагностике. О, только что заметил, вы используете истину и бит ... попробуйте целое и 1 вместо (с обновлением версии).

Похожие вопросы