2013-10-11 194 views
0

我的代碼給出錯誤,而我的數據庫文件爲空。請檢查它並告訴我可能的原因可能是什麼。外鍵問題

Database.java:

package com.example.nearby_places; 

import java.util.ArrayList; 
import java.util.List; 


import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class Database extends SQLiteOpenHelper { 

    //database name & version number 
    private static final String db_name = "nearby_places"; 
    private static final int db_version = 1; 

    //tables 
    private static final String table_placetypes = "placetypes"; 
    private static final String table_places = "table_places"; 

    //column names 
    private static final String type_id = "type_id"; 
    private static final String type_name = "type_name"; 
    private static final String place_id = "place_id"; 
    private static final String place_name = "place_name"; 
    private static final String place_address = "place_address"; 
    private static final String place_contact = "place_contact"; 


    public Database(Context context) { 
     super(context, db_name, null, db_version); 
     // TODO Auto-generated constructor stub 
    } 

    // create table queries 
    String create_table_placetypes = "CREATE TABLE IF NOT EXISTS " + table_placetypes + "(" 
      + type_id + " INTEGER PRIMARY KEY NOT NULL," + type_name + " TEXT" + ")"; 



    String create_table_places = "CREATE TABLE IF NOT EXISTS table_places (place_id INTEGER PRIMARY KEY NOT NULL, place_name TEXT, place_address TEXT, place_contact TEXT, type_id FOREIGN KEY (type_id) REFERENCES table_placetypes(type_id))"; 



    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 

     db.execSQL(create_table_placetypes); 

     Log.d("creating", "placetypes created"); 
     db.execSQL(create_table_places); 
     Log.d("creating", "places created"); 


    } 


    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABLE IF EXISTS " + table_placetypes); 
     db.execSQL("DROP TABLE IF EXISTS " + table_places); 
     onCreate(db); 

    } 
    // add placetypes 
    void addplacetypes (placetypes pt) { 

     SQLiteDatabase db = getWritableDatabase(); 
     ContentValues values = new ContentValues(); 

     values.put(type_name, pt.getTypename()); 

     db.insert(table_placetypes, null, values); 
     db.close(); 

    } 

    // Getting single placetypes 
    placetypes getPlacetypes(int id) { 
     SQLiteDatabase db = this.getReadableDatabase(); 

     Cursor cursor = db.query(table_placetypes, new String[] {type_id, 
       type_name }, type_id + "=?", 
       new String[] { String.valueOf(id) }, null, null, null, null); 
     if (cursor != null) 
      cursor.moveToFirst(); 

     placetypes pt = new placetypes(Integer.parseInt(cursor.getString(0)), 
       cursor.getString(1)); 
     // return contact 
     return pt; 
    } 

// Getting All placetypes 
    public List<placetypes> getAllPlacetypes() { 
     List<placetypes> placetypesList = new ArrayList<placetypes>(); 
     // Select All Query 
     String selectQuery = "SELECT * FROM " + table_placetypes; 

     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 

     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) { 
      do { 
       placetypes pt = new placetypes(); 
       pt.setTypeid(Integer.parseInt(cursor.getString(0))); 
       pt.setTypename(cursor.getString(1)); 


       //String name = cursor.getString(1); 

       //MainActivity.ArrayofName.add(name); 
       // Adding contact to list 
       placetypesList.add(pt); 
      } while (cursor.moveToNext()); 
     } 

     // return placetype list 
     return placetypesList; 
} 

    // Getting placetypes Count 
    public int getPlacetypesCount() { 
     String countQuery = "SELECT * FROM " + table_placetypes; 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(countQuery, null); 
     cursor.close(); 

     // return count 
     return cursor.getCount(); 
    } 

    public void addplaces(places p) { 
     SQLiteDatabase db = getWritableDatabase(); 
     ContentValues values = new ContentValues(); 
     values.put(place_name, p.getPlace_name()); 
     values.put(place_address, p.getPlace_address()); 
     values.put(place_contact, p.getPlace_contact()); 
     values.put(type_id, p.getT_id()); 

     Log.d("Type ID", String.valueOf(p.getT_id())); 
     db.insert(table_places, null, values); 
     db.close(); 

    } 

    places getPlaces(int pid) { 

     SQLiteDatabase db = getReadableDatabase(); 
     Cursor cursor = db.query(table_places, new String[] {place_id, place_name, place_address, place_contact,type_id}, place_id + "=?", new String[] { String.valueOf(pid) } , null, null, null, null); 

     if(cursor != null) 
      cursor.moveToFirst(); 

     places p = new places(Integer.parseInt(cursor.getString(0)), 
       Integer.parseInt(cursor.getString(1)), 
       cursor.getString(2), 
       cursor.getString(3), 
       cursor.getString(4) 
       ); 

     cursor.close(); 

     return p; 

    } 

    public List<places> getAllPlaces(String typeName) { 

     List<places> placeList = new ArrayList<places>(); 
     //String selectQuery = "SELECT * FROM table_places INNER JOIN placetypes ON placetypes.type_id=table_places.type_id "; 
     //String selectQuery = "SELECT * FROM table_places WHERE table_places.type_id="+Integer.toString(typeid); 
     String selectQuery ="SELECT * FROM table_places WHERE placetypes.place_name="+typeName+" INNER JOIN placetypes ON placetypes.type_id=table_places.type_id"; 
     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 


     if(cursor.moveToFirst()) 
     { 
      do{ 
      places p = new places(); 
      /*p.setT_id(cursor.getColumnIndex(type_id)); 
      p.setPlace_id(cursor.getColumnIndex(place_id)); 
      p.setPlace_name(cursor.getColumnIndex(place_name)); 
      */ 
      p.setT_id(cursor.getInt(0)); 
      p.setPlace_id(cursor.getInt(1)); 
      p.setPlace_name(cursor.getString(2)); 
      p.setPlace_address(cursor.getString(3)); 
      p.setPlace_contact(cursor.getString(4)); 

      /*String t_id = cursor.getString(4); 
      String p_name = cursor.getString(2); 
      String p_address = cursor.getString(3); 
      String p_contact = cursor.getString(1);*/ 

      placeList.add(p); 
      }while(cursor.moveToNext()); 
     } 

     cursor.close(); 
     return placeList; 
    } 

    public int getPlaceCount() { 

     String selectQuery = "SELECT * FROM " +table_places; 
     SQLiteDatabase db = getReadableDatabase(); 
     Cursor cursor = db.rawQuery(create_table_places, null); 
     cursor.close(); 

     return cursor.getCount(); 
    } 

} 

logcat的

10-11 05:11:27.479: D/dalvikvm(3671): GC_FOR_ALLOC freed 45K, 10% free 2728K/3004K, paused 270ms, total 274ms 
10-11 05:11:27.689: I/dalvikvm-heap(3671): Grow heap (frag case) to 3.959MB for 1127532-byte allocation 
10-11 05:11:27.959: D/dalvikvm(3671): GC_FOR_ALLOC freed 2K, 7% free 3826K/4108K, paused 268ms, total 268ms 
10-11 05:11:30.049: D/creating(3671): placetypes created 
10-11 05:11:30.099: E/SQLiteLog(3671): (1) near "FOREIGN": syntax error 
10-11 05:11:30.309: D/AndroidRuntime(3671): Shutting down VM 
10-11 05:11:30.309: W/dalvikvm(3671): threadid=1: thread exiting with uncaught exception (group=0xb0f3c648) 
10-11 05:11:30.469: E/AndroidRuntime(3671): FATAL EXCEPTION: main 
10-11 05:11:30.469: E/AndroidRuntime(3671): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.nearby_places/com.example.nearby_places.MainActivity}: android.database.sqlite.SQLiteException: near "FOREIGN": syntax error (code 1): , while compiling: CREATE TABLE IF NOT EXISTS table_places (place_id INTEGER PRIMARY KEY NOT NULL, place_name TEXT, place_address TEXT, place_contact TEXT, type_id FOREIGN KEY (type_id) REFERENCES table_placetypes(type_id)) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.os.Looper.loop(Looper.java:137) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at java.lang.reflect.Method.invoke(Method.java:525) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at dalvik.system.NativeStart.main(Native Method) 
10-11 05:11:30.469: E/AndroidRuntime(3671): Caused by: android.database.sqlite.SQLiteException: near "FOREIGN": syntax error (code 1): , while compiling: CREATE TABLE IF NOT EXISTS table_places (place_id INTEGER PRIMARY KEY NOT NULL, place_name TEXT, place_address TEXT, place_contact TEXT, type_id FOREIGN KEY (type_id) REFERENCES table_placetypes(type_id)) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1672) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1603) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at com.example.nearby_places.Database.onCreate(Database.java:55) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at com.example.nearby_places.Database.getAllPlacetypes(Database.java:105) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at com.example.nearby_places.MainActivity.onCreate(MainActivity.java:29) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.app.Activity.performCreate(Activity.java:5133) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
10-11 05:11:30.469: E/AndroidRuntime(3671):  ... 11 more 
+0

TYPE_ID INT,外鍵? – RobinHood

回答

0

create_table_places應該

String create_table_places = "CREATE TABLE IF NOT EXISTS table_places (place_id INTEGER PRIMARY KEY NOT NULL, place_name TEXT, place_address TEXT, place_contact TEXT, type_id INTEGER, FOREIGN KEY (type_id) REFERENCES table_placetypes(type_id))";