ERROR / AndroidRuntime:引起:android.database.sqlite.SQLiteException:没有这样的列:Gurgaon:

时间:2011-04-03 06:52:10

标签: android

我希望根据从数据库中选择的城市名称显示位置名称,但它给出错误没有这样的列gurgaon我将我的sqlite管理器数据库保存在assets文件夹中.... 那么如何在sqlite中运行嵌套查询以及如何将查询结果存储在android sqlite中的变量中....谢谢

package cabs.h;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.R.string;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DataBaseHelper extends SQLiteOpenHelper{
   //The Android's default system path of your application database.
 private static final int DATABASE_VERSION = 1;
    private static String DB_PATH = "/data/data/cabs.h/databases/";
 private static String DB_NAME = "CabBookingDatabase.sqlite";
 private SQLiteDatabase myDataBase;
 private final Context myContext;

/**
 * Constructor
 * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
 * @param context
 */
public DataBaseHelper(Context context) {

    super(context, DB_NAME, null, DATABASE_VERSION);
    this.myContext = context;
}  

/**
 * Creates a empty database on the system and rewrites it with your own database.
 * */
public void createDataBase() throws IOException{

   boolean dbExist = checkDataBase();

   if (dbExist) {
       Log.v("DB Exists", "db exists");
       // By calling this method here onUpgrade will be called on a
       // writeable database, but only if the version number has been
       // bumped
       this.getWritableDatabase();
       }
       dbExist = checkDataBase();
       if (!dbExist) {
       // By calling this method and empty database will be created into
       // the default system path of your application so we are gonna be
       // able to overwrite that database with our database.
       this.getReadableDatabase();

       try {

         copyDataBase();

      } catch (IOException e) {

          throw new Error("Error copying database");

       }
   }

}

/**
 * Check if the database already exist to avoid re-copying the file each time you open the application.
 * @return true if it exists, false if it doesn't
 */
private boolean checkDataBase(){

   SQLiteDatabase checkDB = null;

   try{
      String myPath = DB_PATH + DB_NAME;
      checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

   }catch(SQLiteException e)
   {

      //database does't exist yet.

   }

   if(checkDB != null){

      checkDB.close();

   }

   return checkDB != null ? true : false;
}

/**
 * Copies your database from your local assets-folder to the just created empty database in the
 * system folder, from where it can be accessed and handled.
 * This is done by transfering bytestream.
 * */
private void copyDataBase() throws IOException
{

   //Open your local db as the input stream
   InputStream myInput = myContext.getAssets().open(DB_NAME);

   // Path to the just created empty db
   String outFileName = DB_PATH + DB_NAME;

   //Open the empty db as the output stream
   OutputStream myOutput = new FileOutputStream(outFileName);

   //transfer bytes from the inputfile to the outputfile
   byte[] buffer = new byte[1024];
   int length;
   while ((length = myInput.read(buffer))>0){
      myOutput.write(buffer, 0, length);
   }

   //Close the streams
   myOutput.flush();
   myOutput.close();
   myInput.close();

}

public void openDataBase() throws SQLException{

   //Open the database
    String myPath = DB_PATH + DB_NAME;
   myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

}

@Override
public synchronized void close() {

       if(myDataBase != null)
          myDataBase.close();

       super.close();

}

@Override
public void onCreate(SQLiteDatabase db) { 

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.w("tag", "Upgrading database from version which will destroy all old data");
    db.execSQL("DROP TABLE IF EXISTS liberQuoti");
    onCreate(db);

}

public Cursor getcity()
{
 String myPath = DB_PATH + DB_NAME;
 myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
 Cursor cur ;
 cur = myDataBase.rawQuery("select cityName from CityType", null);
 int citynameIndex = cur.getColumnIndexOrThrow("cityName");
//String valuecity = cur.getString(citynameIndex);
//Log.d("No.of tweets,,,,,,,", valuecity );

 cur.moveToFirst();
//Log.d("No.of tweets,,,,,,,", +accountnameIndex + "tgr" );
myDataBase.close();


return cur; 
}
//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
public Cursor getloc()
{
 String myPath = DB_PATH + DB_NAME;
 myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
 Cursor cur1,cur2;
 String saa = cabbookingapplication.Selection;
 String sql="select CityType.rowid from CityType where CityType.cityName="+saa+"";
//  int sql=2;
 cur1 = myDataBase.rawQuery("select locationName from Location where cityId=("+sql+")", null);
 cur1.moveToFirst();
 myDataBase.close();
return cur1; 
}
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 public Cursor getservice()
{
 String myPath = DB_PATH + DB_NAME;
 myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
 Cursor cur3;
 cur3 = myDataBase.rawQuery("select serviceType from ServiceType", null);
 cur3.moveToFirst();
 myDataBase.close();
return cur3; 
}
public Cursor getcabtype()
{
 String myPath = DB_PATH + DB_NAME;
 myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
 Cursor cur4;
 cur4 = myDataBase.rawQuery("select carType from CarType", null);
 cur4.moveToFirst();
 myDataBase.close();
return cur4; 
}
public Cursor getcabservice()
{
 String myPath = DB_PATH + DB_NAME;
 myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
 Cursor cur5;
 cur5 = myDataBase.rawQuery("select cabFeatures from CabFeatures", null);
 cur5.moveToFirst();
 myDataBase.close();
return cur5; 
}
public Cursor getday()
{
 String myPath = DB_PATH + DB_NAME;
 myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
 Cursor cur6;
 cur6 = myDataBase.rawQuery("select dayTravell from DayTravell", null);
 cur6.moveToFirst();
 myDataBase.close();
return cur6; 
}

}

3 个答案:

答案 0 :(得分:1)

  1. 您在返回游标时关闭数据库 - 因此游标将指向一个已关闭的数据库,这意味着您无法使用它(您可能可以使用第一条记录,因为您在关闭之前已移动到该数据) 。更不用说开/关需要一些时间。您只需在onCreate中打开数据库一次,然后在onDestroy
  2. 中将其关闭一次
  3. Android仅支持rawQuery中的单个SQL语句,因此无法通过嵌套SQL语句实现所需的内容
  4. 尝试类似:

    String sql = "SELECT CityType.rowid, Location.locationName FROM Location, CityType " +
        "WHERE Location.cityId = CityType.rowid " +
        "AND CityType.cityName = " + saa;
    

    另请发布LogCat的错误输出。

    将您的DatabaseHelper更改为以下内容(请注意,我没有为每个查询打开数据库 - 您需要确保调用{{1}中的openclose方法您的活动的{}和onCreate方法。

    onDestroy

    另外

    • 确保在任何不会立即关闭的游标上调用public class DataBaseHelper extends SQLiteOpenHelper { ... private SQLiteDatabase mDb; // change openDatabase to this: // call it ONCE in onCreate of your activity public SQLiteDatabase open() throws SQLException { if (mDb != null) return; // already opened mDb = this.getReadableDatabase(); return mDb; } // call this in the onDestroy of your activity public void close() { if (mDb == null) return; // db is not open mDb.close(); mDb = null; } // Change getLoc and your other methods to be something like this public Cursor getLocation() { if (mDb == null) throw new NullPointerException("Database has not been opened by activity"); String saa = cabbookingapplication.Selection; String sql = "SELECT CityType.rowid, Location.locationName FROM Location, CityType " + "WHERE Location.cityId = CityType.rowid " + "AND CityType.cityName = " + saa; return mDb.rawQuery(sql); } ... } 以避免内存泄漏(即应管理适配器中使用的游标)
    • 我在上面的示例中没有调用过startManagingCursor,所以如果你愿意,可以调用它。

    我通常在我的适配器之外调用它,所以我可以做类似

    的事情
    Cursor.moveToFirst()

答案 1 :(得分:0)

答案 2 :(得分:0)

尝试使用IN代替=

String sql = "select CityType.rowid from CityType where CityType.cityName = "
    + saa;
cur1 = myDataBase.rawQuery(
    "SELECT locationName FROM Location WHERE cityId in (" + sql + ")", null);

或者只是一个加入:

String sql = "SELECT locationName FROM Location, CityType " +
    "where cityId = CityType.rowid " +
    "AND CityType.cityName = " + saa;

显然在某些设备上,您可能还必须关闭使用getReadableDatabase打开的数据库:

SQLiteDatabase db = getReadableDatabase();
db.close();