2012-05-13 3 views
0

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

адаптер:

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); 
} 

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

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(); 
    } 
} 

LogCat Ошибка:

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 
+0

просто выбросить sqlite ошибку при ошибке запроса и прочитать ошибку. Вам нужно будет делать это весь день навсегда и всегда, чтобы вы могли начать работать сейчас. –

+0

post insertNew способ пожалуйста. –

+0

Был добавлен. – bhekman

ответ

4

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

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

  1. деинсталлировать программу с ADB удаления
  2. переустановить программу.
+0

Я пробовал - не кубики. Список типов данных здесь: http://www.tizag.com/sqlTutorial/sqldatatypes.php – bhekman

+0

http://sqlite.org/datatype3.html SQlite имеет некоторую разницу с SQL –

+0

О, мой плохой. Хорошая точка зрения. Тем не менее, код дает ту же ошибку, если я заменю «бит» на «целое». – bhekman

0

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

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

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

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

+0

Единственные сделанные изменения - это те, что указаны в вызывающем коде, который я добавил выше. Я не думаю, что они требуют изменения версии, но скажите мне, если я ошибаюсь. – bhekman

+0

Честно говоря, это быстро, и я все равно попробую изменить номер версии и посмотреть, что произойдет, потому что я не вижу ничего плохого, хотя вид метода insertNew может помочь в диагностике. О, только что заметили, вы используете true и bit ... попробуйте integer и 1 вместо (с обновлением версии). – Barak

+0

Я переопределил метод onUpdate, я просто не публиковал его. Я добавлю. Этот код управляет версиями или управляется версиями вручную (мне нужно увеличить версию самостоятельно, если да, то как?)? – bhekman

Смежные вопросы