无法显示sqlite中的数据,ERROR“No Such Column:xxx”

时间:2014-03-12 12:15:28

标签: android sqlite

此时我需要你们的帮助,我有以下代码,但是当我在日食中运行时,它完全是错误的,(错误是在下面的代码中签名)     package com.example.database.search;

import java.util.ArrayList;
import java.util.List;
import com.example.search.MainActivity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;

import android.util.Log;
import android.widget.DatePicker;
import android.widget.TextView;
import android.widget.Toast;

public class DBDataSource {

private SQLiteDatabase database;

private DBHelper dbHelper;

private String[] allColumns = { DBHelper.COLUMN_ID,
          DBHelper.COLUMN_NAMA_SMA, 
          DBHelper.COLUMN_ALAMAT_SMA, 
          DBHelper.COLUMN_LATITUDE_SMA, 
          DBHelper.COLUMN_LONGTITUDE_SMA,
          DBHelper.COLUMN_TANGGAL_BERDIRI_SMA, 
          DBHelper.COLUMN_EMAIL_SMA, 
          DBHelper.COLUMN_WEBSITE_SMA, 
          DBHelper.COLUMN_FACEBOOK,
          DBHelper.COLUMN_TWITTER };

public DBDataSource(Context context)
{
    dbHelper = new DBHelper(context);
}

public void open() throws SQLException {
    database = dbHelper.getWritableDatabase();
}

public void close() {
    dbHelper.close();
}

public Sma createSma(String nama, String alamat, Long latitude, Long longtitude, String tgl, String email, String web, String facebook, String twitter) 
{

    ContentValues values = new ContentValues();
    values.put(DBHelper.COLUMN_NAMA_SMA, nama);
    values.put(DBHelper.COLUMN_ALAMAT_SMA, alamat);
    values.put(DBHelper.COLUMN_LATITUDE_SMA, latitude);
    values.put(DBHelper.COLUMN_LONGTITUDE_SMA, longtitude);
    values.put(DBHelper.COLUMN_TANGGAL_BERDIRI_SMA, tgl);
    values.put(DBHelper.COLUMN_EMAIL_SMA, email);
    values.put(DBHelper.COLUMN_WEBSITE_SMA, web);
    values.put(DBHelper.COLUMN_FACEBOOK, facebook);
    values.put(DBHelper.COLUMN_TWITTER, twitter);

    long insertId = database.insert(DBHelper.TABLE_NAME, null,
        values);

    Cursor cursor = database.query(DBHelper.TABLE_NAME,
        allColumns, DBHelper.COLUMN_ID + " = " + insertId, null,
        null, null, null);


    cursor.moveToFirst();



    Sma newSma = cursorToSma(cursor);


    cursor.close();


    return newSma;
  }

 private Sma cursorToSma(Cursor cursor)
 {
    // buat objek sma baru
    Sma sekolah = new Sma();
    // debug LOGCAT
    Log.v("info", "The getLONG "+cursor.getLong(0));
    Log.v("info", "The setLatLng "+cursor.getString(1)+","+cursor.getString(2));

    sekolah.setId(cursor.getLong(0));
    sekolah.setNama(cursor.getString(1));
    sekolah.setAlamat(cursor.getString(2));
    sekolah.setLatitude(cursor.getLong(3));
    sekolah.setLongitude(cursor.getLong(4));
    sekolah.setTgl_berdiri(cursor.getString(5));
    sekolah.setEmail(cursor.getString(6));
    sekolah.setWebsite(cursor.getString(7));
    sekolah.setFacebook(cursor.getString(8));
    sekolah.setTwitter(cursor.getString(9));

    return sekolah;
} 
public ArrayList<Sma> getPoint(String name)
{
    ArrayList<Sma> daftarPoint = new ArrayList<Sma>();
    //THIS QUERY IS SAME LIKE THIS select * from sma where nama_sma = 'user_input'
    String [] query = {dbHelper.COLUMN_NAMA_SMA, dbHelper.COLUMN_LATITUDE_SMA, dbHelper.COLUMN_LONGTITUDE_SMA};
    Cursor c = database.query(DBHelper.TABLE_NAME, query, "nama_sma ="+ name, null, null, null, null);

    c.moveToFirst();
    while (!c.isAfterLast()) 
    {
      Sma sekolah = cursorToSma(c);
      daftarPoint.add(sekolah);
      c.moveToNext();
    }
    c.close();
    return daftarPoint;
}

然后这是SearchResultActivity的代码

package com.example.search;

import java.util.ArrayList;
import com.example.database.search.*;
import android.app.ActionBar;
import android.app.ListActivity;
import android.app.SearchManager;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class SearchResultsActivity extends ListActivity
{
private DBDataSource dataSource; 

private ArrayList<Sma> values;
 private TextView txtQuery;
 @Override
    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search_result);

        dataSource = new DBDataSource(this);

        dataSource.open();

        ActionBar actionBar = getActionBar();

        actionBar.setDisplayHomeAsUpEnabled(true);

        txtQuery = (TextView) findViewById(R.id.txtQuery);

        handleIntent(getIntent());

 }
 @Override
    protected void onNewIntent(Intent intent) 
 {
        setIntent(intent);
        handleIntent(intent);
 }
 /**
     * Handling intent data
     */
 private void handleIntent(Intent intent) 
 { 
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) 
        {
            String query = intent.getStringExtra(SearchManager.QUERY);

                //ERROR GOES HERE >WHEN THIS CODE IS RUN > IT'S SAY THE LOG CAT SAY'S 'no such column : nama_sma'

            values = dataSource.getPoint(query);

            ArrayAdapter<Sma> adapter = new ArrayAdapter<Sma>(this,android.R.layout.simple_list_item_1, values);

            setListAdapter(adapter);

        }
 }
}

任何人都可以帮助我解决这个错误,我真的要感谢所有能够解决此代码的人,谢谢:D

这里是DBHelper     package com.example.database.search;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBHelper extends SQLiteOpenHelper
{

public static final String TABLE_NAME = "sma";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_NAMA_SMA = "nama_sma";
public static final String COLUMN_ALAMAT_SMA = "alamat_sma";
public static final String COLUMN_WEBSITE_SMA ="website_sma";
public static final String COLUMN_FACEBOOK = "facebook_sma";
public static final String COLUMN_TWITTER ="twitter_sma";
public static final String COLUMN_EMAIL_SMA = "email_sma";
public static final String COLUMN_LATITUDE_SMA = "latitude_sma";
public static final String COLUMN_LONGTITUDE_SMA= "longtitude_sma";
public static final String COLUMN_TANGGAL_BERDIRI_SMA ="tanggal_berdiri_sma";

private static final String db_name ="schoolmap.db";

private static final int db_version=1;

  private static final String db_create = "create table "
      + TABLE_NAME + "("
      + COLUMN_ID                   + " integer primary key autoincrement, " //indeks ke-0
      + COLUMN_NAMA_SMA             + " varchar(50) not null, " //indeks ke-1
      + COLUMN_ALAMAT_SMA           + " varchar(50) not null, " //indeks ke-2
      + COLUMN_LATITUDE_SMA         + " Long(20) not null, " //indeks ke-3 
      + COLUMN_LONGTITUDE_SMA       + " Long(20) not null, " //indeks ke-4
      + COLUMN_TANGGAL_BERDIRI_SMA  + " datetime, "   //indeks ke-5
      + COLUMN_EMAIL_SMA            + " varchar(50) not null, " //indeks ke-6
      + COLUMN_WEBSITE_SMA          + " varchar(20), " //indeks ke-7
      + COLUMN_FACEBOOK             + " varchar(20), " //indeks ke-8
      + COLUMN_TWITTER              + " varchar(20) null);";     //indeks ke-9

public DBHelper(Context context) {
    super(context, db_name, null, db_version);
    // Auto generated
}


@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(db_create);
}


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

 }

}

2 个答案:

答案 0 :(得分:0)

除了使用显式名称"nama_sma ="编写和访问列外,请使用您在代码中定义的键名称dbHelper.COLUMN_NAMA_SMA + " ="+

更改您的查询,如下所示:

Cursor c = database.query(DBHelper.TABLE_NAME, query, dbHelper.COLUMN_NAMA_SMA + " ="+ name, null, null, null, null);

答案 1 :(得分:0)

getPoint()中,您传递了一个不带引号的字符串参数:

Cursor c = database.query(DBHelper.TABLE_NAME, query, "nama_sma ="+ name, null, null, null, null);

这会将name中的任何内容视为列名引用而不是文字。 SQL中的字符串文字需要使用''单引号,但最好使用?占位符并绑定这样的args:

Cursor c = database.query(DBHelper.TABLE_NAME, query, "nama_sma = ?", new String[] { name }, null, null, null);