2012-05-13 7 views
-2

imは、ユーザーの検索入力に基づいてデータベース内の場所を検索するアンドロイドのマップアプリケーションを開発しています。 私はデータベースで検索し、データベース内のすべての場所の緯度を返すフィールドを使用してsqliteデータベースを照会しようとしています。フィールドは以下の主キーではありません。 私は助けが必要です。 データベースを作成してアクセスするデータベースクラス。 Places.javaため 主キーを使用しないアンドロイドsqliteデータベースを照会すると、エラーがスローされます。java.lang.NullPointerException

public class Places { 
private Context context; 
private DbHelper dataHelper; 
private SQLiteDatabase database; 

//columns for places table 
public static final String ROW_ID="_id"; 
public static final String P_NAME="placename"; 
public static final String G_NAME="genericname"; 
public static final String LONGITUDE="longitude"; 
public static final String LATITUDE="latitude"; 
public static final String CONTACT="contactnumbers"; 



private static final String DB_NAME="MAP.db"; 
private static final String DB_TABLE_PLACES="places"; 
private static final String DB_TABLE_EXAMS="exam"; 
private static final String DB_TABLE_SMS="message"; 
private static final int DB_VERSION= 1; 

//コンストラクタ

public Places(Context c){ 
    this.context = c; 
} 

//データベースヘルパークラス

private static class DbHelper extends SQLiteOpenHelper { 


//constructor for DbHelper inner class 

public DbHelper(Context context) { 
    super(context, DB_NAME, null, DB_VERSION); 
    // TODO Auto-generated constructor stub 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    // TODO Auto-generated method stub 
    //creating table PLACES 
    db.execSQL("CREATE TABLE "+DB_TABLE_PLACES+"("+ROW_ID+" PRIMARY KEY, " + 
      ""+P_NAME+" TEXT NOT NULL, " + 
      ""+G_NAME+" TEXT NOT NULL, " + 
      ""+LONGITUDE+" TEXT NOT NULL, " + 
      ""+LATITUDE+" TEXT NOT NULL, " + 
      ""+CONTACT+" TEXT);"); 



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

    onCreate(db); 
} 

}

public Places openDatabase() throws SQLiteException{ 
    dataHelper = new DbHelper(context); 
    database= dataHelper.getWritableDatabase(); 
return this; 

}

public void closeDatabase(){ 
dataHelper.close(); 
database.close(); 

}

@SuppressWarnings("null") 
public List<String> getPlaceLatitude(String string) { 
// TODO Auto-generated method stub 

List<String> latitudes = null; 
String[] columns= new String[]{ROW_ID,P_NAME,LATITUDE,LONGITUDE,G_NAME,CONTACT}; 

Cursor c = database.query(DB_TABLE_PLACES, columns,G_NAME+" = "+string, null, null, null, null); 

int iLatitude = c.getColumnIndex(LATITUDE); 
if (c !=null){ 
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){ 
    latitudes.add(c.getString(iLatitude)); 
} 
} 
return latitudes;} 

データベースを照会するためにアクションをトリガする方法。

public void searchDbAndOpenIntent(String search){ 
try{ 
     Places placeDb = new Places(this); 
     placeDb.openDatabase(); 
     List<String> longitude1= placeDb.getPlaceLongitude(search); 
       List<String> latitude1=placeDb.getPlaceLatitude(search); 
     placeDb.closeDatabase(); 
} 
        catch (Exception e) { 
      // TODO:handle exception         Toast.makeText(getBaseContext(),e.toString(),Toast.LENGTH_LONG).show(); 
     } 
} 




public void searchDbAndOpenIntent(String search){ 
try{ 
     Places placeDb = new Places(this); 
     placeDb.openDatabase(); 
     List<String> longitude1= placeDb.getPlaceLongitude(search); 
       List<String> latitude1=placeDb.getPlaceLatitude(search); 
     placeDb.closeDatabase(); 



     } 
        catch (Exception e) { 
      // TODO: handle exception 


      Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG).show(); 
     } 
} 

私は場所の一般的な名前に基づいて緯度を返すようにしたいが、私はgeneric_name列を照会しようとすると、それはjava.lang.NullPointerExceptionがはそれを私が取得ログの猫を.below返してください

 05-14 20:52:37.202: D/ddm-heap(243): Got feature list request 
     05-14 20:52:41.123: E/ActivityThread(243): Failed to find provider info for  com.google.settings 
     05-14 20:52:41.132: E/ActivityThread(243): Failed to find provider info for com.google.settings 
     05-14 20:52:41.172: E/ActivityThread(243): Failed to find provider info for com.google.settings 
     05-14 20:52:41.562: D/dalvikvm(243): GC freed 2007 objects/134424 bytes in 125ms 
     05-14 20:52:41.802: D/LocationManager(243): Constructor: service = [email protected] 
     05-14 20:52:42.012: I/MapActivity(243): Handling network change notification:CONNECTED 
     05-14 20:52:42.012: E/MapActivity(243): Couldn't get connection factory client 
     05-14 20:52:42.453: D/dalvikvm(243): GC freed 4934 objects/288736 bytes in 136ms 
     05-14 20:52:48.852: D/dalvikvm(243): GC freed 10599 objects/817800 bytes in 137ms 
     05-14 20:53:56.712: W/KeyCharacterMap(243): No keyboard for id 0 
     05-14 20:53:56.723: W/KeyCharacterMap(243): Using default keymap: /system /usr/keychars/qwerty.kcm.bin 
     05-14 20:53:59.712: D/LocationManager(243): removeUpdates: listener = [email protected] 
     05-14 20:54:11.812: D/dalvikvm(243): GC freed 5940 objects/725376 bytes in 98ms 
     05-14 20:54:11.812: I/dalvikvm(243): Uncaught exception thrown by finalizer (will be discarded): 
     05-14 20:54:11.812: I/dalvikvm(243): Ljava/lang/IllegalStateException;: Finalizing cursor [email protected] on places that has not been deactivated or closed 
     05-14 20:54:11.812: I/dalvikvm(243):  at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596) 
     05-14 20:54:11.822: I/dalvikvm(243):  at dalvik.system.NativeStart.run(Native Method) 
     05-14 20:54:11.872: E/Database(243): Leak found 
     05-14 20:54:11.872: E/Database(243): java.lang.IllegalStateException: /data/data/my.project.success/databases/MAP.db SQLiteDatabase created and never closed 
     05-14 20:54:11.872: E/Database(243):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1694) 
     05-14 20:54:11.872: E/Database(243):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:738) 
     05-14 20:54:11.872: E/Database(243):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:760) 
     05-14 20:54:11.872: E/Database(243):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:753) 
     05-14 20:54:11.872: E/Database(243):  at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:473) 
     05-14 20:54:11.872: E/Database(243):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193) 
     05-14 20:54:11.872: E/Database(243):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) 
     05-14 20:54:11.872: E/Database(243):  at my.project.success.Places.openDatabase(Places.java:201) 
     05-14 20:54:11.872: E/Database(243):  at my.project.success.SearchActivity.searchDbAndOpenIntent(SearchActivity.java:217) 
     05-14 20:54:11.872: E/Database(243):  at my.project.success.SearchActivity.onClick(SearchActivity.java:151) 
     05-14 20:54:11.872: E/Database(243):  at android.view.View.performClick(View.java:2364) 
     05-14 20:54:11.872: E/Database(243):  at android.view.View.onTouchEvent(View.java:4179) 
     05-14 20:54:11.872: E/Database(243):  at android.widget.TextView.onTouchEvent(TextView.java:6540) 
     05-14 20:54:11.872: E/Database(243):  at android.view.View.dispatchTouchEvent(View.java:3709) 
     05-14 20:54:11.872: E/Database(243):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
     05-14 20:54:11.872: E/Database(243):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
     05-14 20:54:11.872: E/Database(243):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
     05-14 20:54:11.872: E/Database(243):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
     05-14 20:54:11.872: E/Database(243):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
     05-14 20:54:11.872: E/Database(243):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
     05-14 20:54:11.872: E/Database(243):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
     05-14 20:54:11.872: E/Database(243):  at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 
     05-14 20:54:11.872: E/Database(243):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
     05-14 20:54:11.872: E/Database(243):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1691) 
     05-14 20:54:11.872: E/Database(243):  at android.os.Handler.dispatchMessage(Handler.java:99) 
     05-14 20:54:11.872: E/Database(243):  at android.os.Looper.loop(Looper.java:123) 
     05-14 20:54:11.872: E/Database(243):  at  android.app.ActivityThread.main(ActivityThread.java:4363) 
     05-14 20:54:11.872: E/Database(243):  at java.lang.reflect.Method.invokeNative(Native Method) 
     05-14 20:54:11.872: E/Database(243):  at java.lang.reflect.Method.invoke(Method.java:521) 
     05-14 20:54:11.872: E/Database(243):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
     05-14 20:54:11.872: E/Database(243):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
     05-14 20:54:11.872: E/Database(243):  at dalvik.system.NativeStart.main(Native Method) 
     05-14 20:54:12.014: I/dalvikvm(243): Uncaught exception thrown by finalizer (will be discarded): 
     05-14 20:54:12.022: I/dalvikvm(243): Ljava/lang/IllegalStateException;: Finalizing cursor [email protected] on places that has not been deactivated or closed 
     05-14 20:54:12.022: I/dalvikvm(243):  at android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596) 
     05-14 20:54:12.032: I/dalvikvm(243):  at dalvik.system.NativeStart.run(Native Method) 
     05-14 20:54:12.152: E/Database(243): Leak found 
     05-14 20:54:12.152: E/Database(243): java.lang.IllegalStateException: /data/data/my.project.success/databases/MAP.db SQLiteDatabase created and never closed 
     05-14 20:54:12.152: E/Database(243):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1694) 
     05-14 20:54:12.152: E/Database(243):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:738) 
     05-14 20:54:12.152: E/Database(243):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:760) 
     05-14 20:54:12.152: E/Database(243):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:753) 
     05-14 20:54:12.152: E/Database(243):  at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:473) 
     05-14 20:54:12.152: E/Database(243):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193) 
     05-14 20:54:12.152: E/Database(243):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) 
     05-14 20:54:12.152: E/Database(243):  at my.project.success.Places.openDatabase(Places.java:201) 
     05-14 20:54:12.152: E/Database(243):  at my.project.success.SearchActivity.searchDbAndOpenIntent(SearchActivity.java:217) 
     05-14 20:54:12.152: E/Database(243):  at my.project.success.SearchActivity.onClick(SearchActivity.java:79) 
     05-14 20:54:12.152: E/Database(243):  at android.view.View.performClick(View.java:2364) 
     05-14 20:54:12.152: E/Database(243):  at android.view.View.onTouchEvent(View.java:4179) 
     05-14 20:54:12.152: E/Database(243):  at android.widget.TextView.onTouchEvent(TextView.java:6540) 
     05-14 20:54:12.152: E/Database(243):  at android.view.View.dispatchTouchEvent(View.java:3709) 
     05-14 20:54:12.152: E/Database(243):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
     05-14 20:54:12.152: E/Database(243):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
     05-14 20:54:12.152: E/Database(243):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
     05-14 20:54:12.152: E/Database(243):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
     05-14 20:54:12.152: E/Database(243):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
     05-14 20:54:12.152: E/Database(243):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
     05-14 20:54:12.152: E/Database(243):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
     05-14 20:54:12.152: E/Database(243):  at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 
     05-14 20:54:12.152: E/Database(243):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
     05-14 20:54:12.152: E/Database(243):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1691) 
     05-14 20:54:12.152: E/Database(243):  at android.os.Handler.dispatchMessage(Handler.java:99) 
     05-14 20:54:12.152: E/Database(243):  at android.os.Looper.loop(Looper.java:123) 
     05-14 20:54:12.152: E/Database(243):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
     05-14 20:54:12.152: E/Database(243):  at java.lang.reflect.Method.invokeNative(Native Method) 
     05-14 20:54:12.152: E/Database(243):  at java.lang.reflect.Method.invoke(Method.java:521) 
     05-14 20:54:12.152: E/Database(243):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
     05-14 20:54:12.152: E/Database(243):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
     05-14 20:54:12.152: E/Database(243):  at dalvik.system.NativeStart.main(Native Method) 
+0

リスト latitudes = null; .... – Selvin

+0

ログキャストにNPEは表示されません... – Barak

答えて

0

を押したときに、データベースを照会ボタンはあなたのクエリで単一引用符でstring変数を囲む必要があります。

それは次のようになります。

int iLatitude = c.getColumnIndex(LATITUDE); 
if (c !=null){ 
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){ 
    latitudes.add(c.getString(iLatitude)); 
} 
:あなたが最初の最初のレコードに移動することなく、カーソルにアクセスしようとしているように、これは、間違ってい

G_NAME+" = '" + string + "'" 

EDIT

試用版:

c.moveToFirst(); 
int iLatitude = c.getColumnIndex(LATITUDE); 
if (c !=null){ 
    while(c.isAfterLast == false){ 
     latitudes.add(c.getString(iLatitude)); 
     c.moveToNext(); 
    } 
} 

これもループを変更します。ほとんどの場合、可読性のためです。

+0

私はそれをしましたが、まだjava.lang.NullPointerExceptionというエラーをスローしています – quame

+0

どこですか?どの行?私はもう少し私の答えに追加する別の問題を見つけましたが、それはエラーが発生しますが、NPEは生成されません。 – Barak

+0

私は最初にカーソルを移動し、whileループでループすることによって修正を試みましたが、それでもjava.lang.NullPointerExceptionが返されます。 しかし、別の列(G_NAME列)をクエリする必要があるため、私はquery.pleaseにプライマリキーを使って助けてくれました。 – quame

関連する問題