ОШИБКА / AndroidRuntime: Вызвано: android.database.sqlite.SQLiteException: нет такого столбца: Gurgaon:

1

Я хочу, чтобы название отображаемого местоположения соответствовало названию города, выбранному из базы данных, но оно дает ошибку без такого столбца gurgaon. Я сохраняю базу данных sqlite-менеджера в папке с ресурсами. поэтому, как запустить вложенный запрос в sqlite и как сохранить результат запроса в переменной в sqlite android... спасибо

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 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 ответа

1
Лучший ответ
  • Вы закрываете свою базу данных при возврате курсоров - таким образом, курсор укажет на закрытую базу данных, что означает, что вы не можете ее использовать (вы могли бы использовать первую запись с момента ее перемещения до ее закрытия), Не говоря уже о том, что открытие/закрытие занимает некоторое время. Вы должны просто открыть DB один раз в onCreate, а затем закрыть его один раз в onDestroy.
  • Android поддерживает только один оператор SQL в rawQuery, поэтому то, чего вы хотите, не может быть достигнуто путем вложения операторов SQL

Попробуйте что-то вроде:

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

Также отправьте сообщение об ошибке из LogCat.

Измените свой DatabaseHelper на следующее: (я не открываю базу данных для каждого запроса - вам нужно вызвать методы open и close в методах 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() в моем примере выше, поэтому позвоните, если хотите.

Я обычно называю это вне моего адаптера, поэтому я могу сделать что-то вроде

if (cursor.getCount() > 0) {
    // we have at least 1 record
    while (cursor.moveToNext()) {
        // do something with current row
    }
} else {
   // no rows, show an empty message or something
}
  • 0
    @ joseph /data/data/cabs.h/databases/CabBookingDatabase.sqlite SQLiteDatabase создана и никогда не закрывается
  • 0
    Эрл привет ... это работает, но проблема вместо "saa" переменная "null" идет
Показать ещё 1 комментарий
0
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();
  • 0
    public Cursor getloc () {String myPath = DB_PATH + DB_NAME; myDataBase = SQLiteDatabase.openDatabase (myPath, null, SQLiteDatabase.OPEN_READONLY); Курсор cur1, cur2; Строка saa = cabbookingapplication.Selection; String sql = "ВЫБРАТЬ locationName FROM Location, CityType" + "где cityId = CityType.rowid" + "AND CityType.cityName =" + saa; // int sql = 2; cur1 = myDataBase.rawQuery (sql, null); cur1.moveToFirst (); myDataBase.close (); возврат cur1; }
  • 0
    у меня не работает locaion не показывается в блесне и дает такую же ошибку
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню