首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ERROR/AndroidRuntime:原因: android.database.sqlite.SQLiteException:没有这样的列: Gurgaon:

问ERROR/AndroidRuntime:原因: android.database.sqlite.SQLiteException:没有这样的列: Gurgaon:
EN

Stack Overflow用户
提问于 2011-04-03 14:52:10
回答 3查看 4.7K关注 0票数 1

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

代码语言:javascript
复制
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; 
}

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-03 20:04:48

  1. 返回游标时关闭数据库--因此游标将指向关闭的数据库,这意味着您不能使用它(您可以使用第一条记录,因为您在关闭它之前移动到该记录)。更不用说打开/关闭需要花费一些时间。您应该只在onCreate中打开数据库一次,然后在onDestroy.
  2. Android中关闭一次。在rawQuery中只支持一条SQL语句,因此不能通过嵌套SQL语句

来实现您想要的结果

尝试如下所示:

代码语言:javascript
复制
String sql = "SELECT CityType.rowid, Location.locationName FROM Location, CityType " +
    "WHERE Location.cityId = CityType.rowid " +
    "AND CityType.cityName = " + saa;

另外,请发布来自LogCat的错误输出。

将您的DatabaseHelper更改为如下所示(请注意,我不是为每个查询打开数据库-您需要确保在活动的onCreate和onDestroy方法中调用open和close方法)。

代码语言:javascript
复制
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(),所以如果你愿意,可以调用它。

我通常在我的适配器外部调用它,这样我就可以这样做了

代码语言:javascript
复制
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
}
票数 1
EN

Stack Overflow用户

发布于 2011-04-03 15:23:05

票数 0
EN

Stack Overflow用户

发布于 2011-04-03 15:24:46

尝试使用IN而不是=

代码语言:javascript
复制
String sql = "select CityType.rowid from CityType where CityType.cityName = "
    + saa;
cur1 = myDataBase.rawQuery(
    "SELECT locationName FROM Location WHERE cityId in (" + sql + ")", null);

或者仅仅是一个连接:

代码语言:javascript
复制
String sql = "SELECT locationName FROM Location, CityType " +
    "where cityId = CityType.rowid " +
    "AND CityType.cityName = " + saa;

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

代码语言:javascript
复制
SQLiteDatabase db = getReadableDatabase();
db.close();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5528059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档