外键问题

时间:2013-10-11 09:20:40

标签: android sqlite

我的代码出错,我的数据库文件为空。请检查并告诉我可能的原因。

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

1 个答案:

答案 0 :(得分: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))";