2017-02-10 123 views
0

因此,我正在制作一个行程类型的应用程序,用户在该行程中制作行程并在一个行程中包含多个条目。所以我需要能够从一个行程中检索所有数据。例如,如果行程被称为星期一,并且用户选择该行程来查看,我会希望从中得到所有的数据。我通过使用ItineraryName来完成此操作,例如星期一,被传递给另一个活动,这工作,但我只看到通过打印语句来检查值已通过正确。Android studio SQLite数据库特定条目的数据检索

目前,我可以查看特定行程的数据,例如,星期一,只有当我手动输入到选择参数变量(见下文),但如果我尝试通过它通过一个变量它不会工作,我得到一个错误,我也尝试把“%”+ ItineraryName +“%”到选择参数,但我提出了一个空白的活动。误差只是变量:

过程:com.example.chiraag.qavel,PID:10198 了java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.chiraag.qavel/com.example.chiraag.qavel .ItineraryDetails}:java.lang.IllegalArgumentException:索引1处的绑定值为null at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) (android.app.ActivityThread.Office.app.ActivityThread.Office11(ActivityThread.java) at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handl er.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(本地方法) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 由java导致:java .lang.IllegalArgumentException:索引1处的绑定值为null at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:164) at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200) 在android.database.sqlite.SQLiteDirec tCursorDriver.query(SQLiteDirectCursorDriver.java:47) at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316) at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:400) at android。 database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:294) at com.example.chiraag.qavel.DBManager.Query(DBManager.java:101) at com.example.chiraag.qavel.ItineraryDetails.loadItinerary(ItineraryDetails。 java:47) at com.example.chiraag.qavel.ItineraryDetails.onCreate(ItineraryDetails.java:34) at android.app.Activity.performCreate(Activity.java:6237) at android.app.Instrumentation.callActivityOnC在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) at android.app.ActivityThread.-wrap11 (ActivityThread.java) at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1344) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper .java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method。调用(本地方法) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

代码ItineraryDetails:

public class ItineraryDetails extends AppCompatActivity { 

DBManager db; 
myAdapter myAdapter; 
ListView ls; 
private String ItineraryName; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_itinerary_details); 

    db = new DBManager(this); 
    ls = (ListView)findViewById(R.id.ItineraryDetails_listview); 

    loadItinerary(); 

    Bundle bundle = getIntent().getExtras(); 

    ItineraryName = bundle.getString("Name"); 
    System.out.println("Name " + ItineraryName); 

} 

public void loadItinerary(){ 
    ArrayList<Adapter> listData = new ArrayList<Adapter>(); 
    listData.clear(); 
    String []selectionargs = {ItineraryName}; 
    Cursor cursor = db.Query("Itinerary",null, "ItineraryName like ?", selectionargs , DBManager.ColId); 
    if (cursor.moveToFirst()) { 
     do { 
      listData.add(new Adapter(
        null 
        , cursor.getString(cursor.getColumnIndex(DBManager.ColName)) 
        , cursor.getString(cursor.getColumnIndex(DBManager.ColLocation)) 
        , null 
        , null 
        , null 
        ,cursor.getString(cursor.getColumnIndex(DBManager.ColTime)) 
        ,null,null, null, null 
        ,null 
        ,null)); 
     } while (cursor.moveToNext()); 
    } 
    myAdapter = new myAdapter(listData); 
    ls.setAdapter(myAdapter); 
} 

class myAdapter extends BaseAdapter { 
    public ArrayList<Adapter> listItem; 
    Adapter ac; 
    public myAdapter(ArrayList<Adapter> listItem) { 
     this.listItem = listItem; 

    } 


    @Override 
    public int getCount() { 
     return listItem.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View view, ViewGroup viewGroup) { 

     LayoutInflater myInflator = getLayoutInflater(); 
     final View myView = myInflator.inflate(R.layout.list_items_itinerary_details, null); 

     ac = listItem.get(position); 

     TextView ItineraryName = (TextView) myView.findViewById(R.id.tvItineraryDetailsEntryName); 
     ItineraryName.setText(ac.Name); 

     TextView ItineraryLocation = (TextView) myView.findViewById(R.id.tvItineraryDetailsEntryLocation); 
     ItineraryLocation.setText(ac.Location); 

     TextView ItineraryTime = (TextView)myView.findViewById(R.id.tvItineraryDetailsEntryTime); 
     ItineraryTime.setText(ac.Time); 

     return myView; 
    } 
} 
} 

代码DBManager:

public class DBManager { 

private SQLiteDatabase sqlDB; 
static final String ColId = "ID"; 
static final String DBName = "InternalDB"; 
static final String TableName = "BookmarkAttraction"; 
static final String TableName2 = "BookmarkTransport"; 
static final String TableName3 = "Itinerary"; 
static final String ColItineraryName = "ItineraryName"; 
static final String ColDate = "Date"; 
static final String ColType = "Type"; 
static final String ColName = "Name"; 
static final String ColLocation = "Location"; 
static final String ColOpening = "OpeningTime"; 
static final String ColClosing = "ClosingTime"; 
static final String ColNearbyStop = "NerbyStop1"; 


static final String ColTime = "Time"; 
static final String ColNextStop = "NextStop"; 
static final String ColPhoneNumber = "PhoneNumber"; 

static final int DBVersion = 1; 

static final String CreateTable = "CREATE TABLE IF NOT EXISTS " + TableName + "(ID INTEGER PRIMARY KEY AUTOINCREMENT," + ColType+ " TEXT," + 
     ColName+ " TEXT," + ColLocation+ " TEXT," + ColOpening+ " TEXT," +ColClosing+ " TEXT," + ColNearbyStop+ " TEXT);"; 

static final String CreateTabe2 = "CREATE TABLE IF NOT EXISTS " +TableName2 + "(ID INTEGER PRIMARY KEY AUTOINCREMENT," 
     + ColType + " TEXT," 
     + ColName + " TEXT," 
     + ColLocation + " TEXT," 
     + ColTime+ " TEXT," 
     + ColNextStop + " TEXT," 
     + ColPhoneNumber + " TEXT);"; 

static final String CreateTable3 = "CREATE TABLE IF NOT EXISTS " + TableName3 + "(ID INTEGER PRIMARY KEY AUTOINCREMENT," + ColItineraryName + " TEXT," 
     + ColDate + " TEXT," + ColName + " TEXT," + ColLocation + " TEXT," + ColTime + " TEXT);"; 


static class DBHelper extends SQLiteOpenHelper{ 
    Context context; 

    DBHelper(Context context){ 
     super(context, DBName, null, DBVersion); 
     this.context = context; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     Toast.makeText(context,DBName,Toast.LENGTH_LONG).show(); 
     db.execSQL(CreateTable); 
     Toast.makeText(context,"Table is created ", Toast.LENGTH_LONG).show(); 
     db.execSQL(CreateTabe2); 
     Toast.makeText(context,"Transport table created", Toast.LENGTH_LONG).show(); 
     db.execSQL(CreateTable3); 
     Toast.makeText(context,"Itin table created", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int i, int i1) { 
     db.execSQL("DROP TABLE IF EXISTS" + TableName); 
     db.execSQL("DROP TABLE IF EXISTS" + TableName2); 
     db.execSQL("DROP TABLE IF EXISTS" + TableName3); 
     onCreate(db); 
    } 
} 


public DBManager(Context context){ 
    DBHelper db = new DBHelper(context); 
    sqlDB = db.getWritableDatabase(); 
} 

public long Insert(String tablename,ContentValues values){ 
    long ID = sqlDB.insert(tablename,"",values); 
    return ID; 
} 

public Cursor Query(String tablename, String [] projection, String selection, String [] selectionArgs, String sortOrder){ 
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 
    qb.setTables(tablename); 
    Cursor cursor = qb.query(sqlDB,projection, selection, selectionArgs,null,null,sortOrder); 
    return cursor; 
} 

public int Delete(String tablename,String selection, String[] selectionArgs){ 
    int count = sqlDB.delete(tablename,selection,selectionArgs); 
    return count; 
} 
} 

错误指向我的DBManager类我的查询方法,我可能已经结构化的错,我不知道,因为我第一次创建它重新处理表中的所有数据。任何帮助,这将是非常感谢你。

回答

1

看起来好像在尝试绑定变量ItineraryName,然后才定义它。在定义ItineraryName之前调用loadItinerary,但在创建游标时尝试在查询中使用它。我认为这是导致你看到的错误

+0

谢谢你做了工作,不知道我怎么没有看到 – Sam

相关问题