Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在一个SQLITE数据库中存储多个表的问题_Android_Database_Sqlite_Store - Fatal编程技术网

Android 在一个SQLITE数据库中存储多个表的问题

Android 在一个SQLITE数据库中存储多个表的问题,android,database,sqlite,store,Android,Database,Sqlite,Store,我在一个数据库中存储多个表时遵循了这个示例 我已经创建了4个DBAdapter(DBAdapter、CarsDBAdapter、boatsdadapter和CyclesDBAdapter)。但在其中一个DBAdapter中,我在db适配器中创建了3个表。然后我为其他3个db适配器创建了3个非DBadaper类。这些表没有插入到数据库中,而且我不确定应该在非DBAdapter类中声明哪个DBAdapter 我需要帮助。如果能提供任何帮助,我将不胜感激 下面是我键入的代码 DBAdapter.jav

我在一个数据库中存储多个表时遵循了这个示例

我已经创建了4个DBAdapter(DBAdapter、CarsDBAdapter、boatsdadapter和CyclesDBAdapter)。但在其中一个DBAdapter中,我在db适配器中创建了3个表。然后我为其他3个db适配器创建了3个非DBadaper类。这些表没有插入到数据库中,而且我不确定应该在非DBAdapter类中声明哪个DBAdapter

我需要帮助。如果能提供任何帮助,我将不胜感激

下面是我键入的代码

DBAdapter.java

public class DBAdapter
{
    public static final String DATABASE_NAME = "stuffIOwn";
    public static final int DATABASE_VERSION = 2;

    private static final String CREATE_TABLE_CARS = "create table cars(_id integer primary key autoincrement, " //$NON-NLS-1$
            +CarsDBAdapter.NAME+ " TEXT," //$NON-NLS-1$
            +CarsDBAdapter.MODEL+ " TEXT," //$NON-NLS-1$
            +CarsDBAdapter.YEAR+ " TEXT" +");"; //$NON-NLS-1$

    private static final String CREATE_TABLE_BOATS = "create table boats(_id integer primary key autoincrement, " //$NON-NLS-1$
            +BoatsDBAdapter.NAME+ " TEXT," //$NON-NLS-1$
            +BoatsDBAdapter.MODEL+ " TEXT," //$NON-NLS-1$
            +BoatsDBAdapter.YEAR+ " TEXT" +");"; //$NON-NLS-1$

    private static final String CREATE_TABLE_CYCLES = "create table cycles(_id integer primary key autoincrement, " //$NON-NLS-1$
            +CyclesDBAdapter.NAME+ " TEXT," //$NON-NLS-1$
            +CyclesDBAdapter.MODEL+ " TEXT," //$NON-NLS-1$
            +CyclesDBAdapter.YEAR+ " TEXT" +");"; //$NON-NLS-1$

    private final Context context;
    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    public DBAdapter(Context ctx)     
    {         
        this.context = ctx;         
        this.DBHelper = new DatabaseHelper(this.context);     
    }

    private static class DatabaseHelper extends SQLiteOpenHelper      
    {         
        DatabaseHelper(Context context)          
        {             
            super(context, DATABASE_NAME, null, DATABASE_VERSION);         
            }          
        @Override         
        public void onCreate(SQLiteDatabase db)          
        {             
            db.execSQL(CREATE_TABLE_CARS);             
            db.execSQL(CREATE_TABLE_BOATS);             
            db.execSQL(CREATE_TABLE_CYCLES);                   
        }          
        @Override         
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)          
        {                            
            // Adding any table mods to this guy here         
        }     
    }//end DatabaseHelper class

    public DBAdapter open() throws SQLException      
    {         
    this.db = this.DBHelper.getWritableDatabase();         
    return this;     
    }      
    /**      
     * close the db 
     *return type: void      
     */    
    public void close()      
    {        
        this.DBHelper.close();     
    }

}
public class CarsDBAdapter
{
    public static final String ROW_ID = "_id";
    public static final String NAME = "name";
    public static final String MODEL = "model";
    public static final String YEAR = "year";

    private static final String DATABASE_TABLE = "cars";

    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;

    private final Context mCtx;

    private static class DatabaseHelper extends SQLiteOpenHelper
    {
        DatabaseHelper(Context context)
        {
            super(context, DBAdapter.DATABASE_NAME, null, DBAdapter.DATABASE_VERSION);          
        }

        @Override
        public void onCreate(SQLiteDatabase db)
        {           
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
        {           
        }
    }// end DatabaseHelper class

    public CarsDBAdapter(Context ctx)
    {
        this.mCtx = ctx;
    }

    public CarsDBAdapter open() throws SQLException
    {
        this.mDbHelper = new DatabaseHelper(this.mCtx);
        this.mDb = this.mDbHelper.getWritableDatabase();
        return this;
    }

    public void close()
    {
        this.mDbHelper.close();
    }

    public long insertCars(String name, String model, String year)
    {
        ContentValues initialValues = new ContentValues();
        initialValues.put(NAME, name);
        initialValues.put(MODEL, model);
        initialValues.put(YEAR, year);
        return mDb.insert(DATABASE_TABLE, null, initialValues);
    }

    public long create(String name, String model, String year)
    {
        ContentValues initialValues = new ContentValues();

        initialValues.put(NAME, name);
        initialValues.put(MODEL, model);
        initialValues.put(YEAR, year);
        return this.mDb.insert(DATABASE_TABLE, null, initialValues); 
    }

    public boolean deleteCar(long rowId) 
    {          
        return this.mDb.delete(DATABASE_TABLE, ROW_ID + "=" + rowId, null) > 0; //$NON-NLS-1$     
    }

     public Cursor getAllCars() 
     {          
         return this.mDb.query(DATABASE_TABLE, new String[] { ROW_ID, NAME, MODEL, YEAR }, null, null, null, null, null);       
     }

     public Cursor getCar(long rowId) throws SQLException
     {
         Cursor mCursor = this.mDb.query(true, DATABASE_TABLE, new String[] {ROW_ID, NAME, MODEL, YEAR}, ROW_ID + "=" + rowId,
                 null, null, null, null, null);

         if(mCursor != null)
         {
             mCursor.moveToFirst();
         }

         return mCursor;
     }

     public boolean updateCar(long rowId, String name, String model, String year)
     {
         ContentValues args = new ContentValues();

         args.put(NAME, name);
         args.put(MODEL, model);
         args.put(YEAR, year);
         return this.mDb.update(DATABASE_TABLE, args, ROW_ID + "=" + rowId, null) >0;  
     }

}//end CarsDBAdapter class
CarsDBAdapter.java

public class DBAdapter
{
    public static final String DATABASE_NAME = "stuffIOwn";
    public static final int DATABASE_VERSION = 2;

    private static final String CREATE_TABLE_CARS = "create table cars(_id integer primary key autoincrement, " //$NON-NLS-1$
            +CarsDBAdapter.NAME+ " TEXT," //$NON-NLS-1$
            +CarsDBAdapter.MODEL+ " TEXT," //$NON-NLS-1$
            +CarsDBAdapter.YEAR+ " TEXT" +");"; //$NON-NLS-1$

    private static final String CREATE_TABLE_BOATS = "create table boats(_id integer primary key autoincrement, " //$NON-NLS-1$
            +BoatsDBAdapter.NAME+ " TEXT," //$NON-NLS-1$
            +BoatsDBAdapter.MODEL+ " TEXT," //$NON-NLS-1$
            +BoatsDBAdapter.YEAR+ " TEXT" +");"; //$NON-NLS-1$

    private static final String CREATE_TABLE_CYCLES = "create table cycles(_id integer primary key autoincrement, " //$NON-NLS-1$
            +CyclesDBAdapter.NAME+ " TEXT," //$NON-NLS-1$
            +CyclesDBAdapter.MODEL+ " TEXT," //$NON-NLS-1$
            +CyclesDBAdapter.YEAR+ " TEXT" +");"; //$NON-NLS-1$

    private final Context context;
    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    public DBAdapter(Context ctx)     
    {         
        this.context = ctx;         
        this.DBHelper = new DatabaseHelper(this.context);     
    }

    private static class DatabaseHelper extends SQLiteOpenHelper      
    {         
        DatabaseHelper(Context context)          
        {             
            super(context, DATABASE_NAME, null, DATABASE_VERSION);         
            }          
        @Override         
        public void onCreate(SQLiteDatabase db)          
        {             
            db.execSQL(CREATE_TABLE_CARS);             
            db.execSQL(CREATE_TABLE_BOATS);             
            db.execSQL(CREATE_TABLE_CYCLES);                   
        }          
        @Override         
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)          
        {                            
            // Adding any table mods to this guy here         
        }     
    }//end DatabaseHelper class

    public DBAdapter open() throws SQLException      
    {         
    this.db = this.DBHelper.getWritableDatabase();         
    return this;     
    }      
    /**      
     * close the db 
     *return type: void      
     */    
    public void close()      
    {        
        this.DBHelper.close();     
    }

}
public class CarsDBAdapter
{
    public static final String ROW_ID = "_id";
    public static final String NAME = "name";
    public static final String MODEL = "model";
    public static final String YEAR = "year";

    private static final String DATABASE_TABLE = "cars";

    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;

    private final Context mCtx;

    private static class DatabaseHelper extends SQLiteOpenHelper
    {
        DatabaseHelper(Context context)
        {
            super(context, DBAdapter.DATABASE_NAME, null, DBAdapter.DATABASE_VERSION);          
        }

        @Override
        public void onCreate(SQLiteDatabase db)
        {           
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
        {           
        }
    }// end DatabaseHelper class

    public CarsDBAdapter(Context ctx)
    {
        this.mCtx = ctx;
    }

    public CarsDBAdapter open() throws SQLException
    {
        this.mDbHelper = new DatabaseHelper(this.mCtx);
        this.mDb = this.mDbHelper.getWritableDatabase();
        return this;
    }

    public void close()
    {
        this.mDbHelper.close();
    }

    public long insertCars(String name, String model, String year)
    {
        ContentValues initialValues = new ContentValues();
        initialValues.put(NAME, name);
        initialValues.put(MODEL, model);
        initialValues.put(YEAR, year);
        return mDb.insert(DATABASE_TABLE, null, initialValues);
    }

    public long create(String name, String model, String year)
    {
        ContentValues initialValues = new ContentValues();

        initialValues.put(NAME, name);
        initialValues.put(MODEL, model);
        initialValues.put(YEAR, year);
        return this.mDb.insert(DATABASE_TABLE, null, initialValues); 
    }

    public boolean deleteCar(long rowId) 
    {          
        return this.mDb.delete(DATABASE_TABLE, ROW_ID + "=" + rowId, null) > 0; //$NON-NLS-1$     
    }

     public Cursor getAllCars() 
     {          
         return this.mDb.query(DATABASE_TABLE, new String[] { ROW_ID, NAME, MODEL, YEAR }, null, null, null, null, null);       
     }

     public Cursor getCar(long rowId) throws SQLException
     {
         Cursor mCursor = this.mDb.query(true, DATABASE_TABLE, new String[] {ROW_ID, NAME, MODEL, YEAR}, ROW_ID + "=" + rowId,
                 null, null, null, null, null);

         if(mCursor != null)
         {
             mCursor.moveToFirst();
         }

         return mCursor;
     }

     public boolean updateCar(long rowId, String name, String model, String year)
     {
         ContentValues args = new ContentValues();

         args.put(NAME, name);
         args.put(MODEL, model);
         args.put(YEAR, year);
         return this.mDb.update(DATABASE_TABLE, args, ROW_ID + "=" + rowId, null) >0;  
     }

}//end CarsDBAdapter class
对BoatsDBAdapter和CyclesDBAdapter类执行了相同的操作,但insert、update和delete方法名称不同。 这些是非DBAdapter类

Cars.java

public class Cars extends Activity
{
    final Context context = this;

     /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.cars);

        CarsDBAdapter carsDB = new CarsDBAdapter(this);

        //DBAdapter dbA = new DBAdapter(this);

        carsDB.open();
        long id;
        id = carsDB.insertCars("Mercedes", "MERCDS", "2000");
        id = carsDB.insertCars("BMW", "BMWTO", "1999");
        carsDB.close();

        carsDB.open();

        Cursor c = carsDB.getAllCars();
        if (c.moveToFirst())
        {
            do
            {
                DisplayContact(c);
            } while (c.moveToNext());
        }

        carsDB.close();

        Button btnMenu = (Button) findViewById(R.id.btnMenu);
        btnMenu.setOnClickListener(new View.OnClickListener()
            {

                @Override
                public void onClick(View v)
                {
                    Intent menuIntent = new Intent(context, VehiclesMenu.class);
                    startActivity(menuIntent);

                }
            });
    }//end onCreate()

    public void DisplayContact(Cursor c)
    {
        Toast.makeText(
                this,
                "id: " + c.getString(0) + "\n" + "Name: " + c.getString(1)
                        + "\n" + "Model:  " + c.getString(2) + "\n" + "Year: " + c.getString(3),  Toast.LENGTH_LONG)
                .show();
    }
}
我对Boats.java和Cycles.java也做了同样的操作,只是我在Boats.java中声明了BoatsDBAdapter,在Cycles.java中声明了CyclesDBAdapter

CyclesDBAdapter cyclesDB = new CyclesDBAdapter(this);

        cyclesDB.open();
        long id;
        id = cyclesDB.insertCycles("Mountain-bike", "ADCFG", "2004");
        id = cyclesDB.insertCycles("Dirt-bike", "VBNGH", "2006");
        cyclesDB.close();

        cyclesDB.open();
        Cursor c = cyclesDB.getAllCycles();
        if (c.moveToFirst())
        {
            do
            {
                DisplayContact(c);
            } while (c.moveToNext());
        }
        cyclesDB.close();
在Boats.java中

BoatsDBAdapter boatsDB = new BoatsDBAdapter(this);

        boatsDB.open();
        long id;
        id = boatsDB.insertBoats("Jet-ski", "ERTYU", "2002");
        id = boatsDB.insertBoats("Motor-boat", "MBCTY", "2003");
        boatsDB.close();

        boatsDB.open();

        Cursor c = boatsDB.getAllBoats();
        if (c.moveToFirst())
        {
            do
            {
                DisplayContact(c);
            } while (c.moveToNext());
        }

        boatsDB.close();
在Cycles.java中

CyclesDBAdapter cyclesDB = new CyclesDBAdapter(this);

        cyclesDB.open();
        long id;
        id = cyclesDB.insertCycles("Mountain-bike", "ADCFG", "2004");
        id = cyclesDB.insertCycles("Dirt-bike", "VBNGH", "2006");
        cyclesDB.close();

        cyclesDB.open();
        Cursor c = cyclesDB.getAllCycles();
        if (c.moveToFirst())
        {
            do
            {
                DisplayContact(c);
            } while (c.moveToNext());
        }
        cyclesDB.close();
更新
我对代码做了一些更新。我已将插入代码添加到CarsDBAdapter中。但是插入代码不在上面链接中的示例中。我已经删除了BoatsDBAdapter、CyclesDBAdapter、Boats和Cycles类,因为代码类似于CarsDBAdapter和Cars类。

我将有三个适配器,看起来类似于下面的适配器(我只是放了一个作为演示,但每个适配器的想法都是一样的

public class CarsDBAdapter {
    public static final String ROW_ID = "_id";
    public static final String NAME = "name";
    public static final String MODEL = "model";
    public static final String YEAR = "year";

    private static final String DATABASE_TABLE = "cars";

    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;

    private final Context mCtx;

    private static class DatabaseHelper extends SQLiteOpenHelper {

        DatabaseHelper(Context context) {
            super(context, DBAdapter.DATABASE_NAME, null, DBAdapter.DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }

    /**
     * Constructor - takes the context to allow the database to be
     * opened/created
     * 
     * @param ctx
     *            the Context within which to work
     */
    public CarsDBAdapter(Context ctx) {
        this.mCtx = ctx;
    }

    /**
     * Open the cars database. If it cannot be opened, try to create a new
     * instance of the database. If it cannot be created, throw an exception to
     * signal the failure
     * 
     * @return this (self reference, allowing this to be chained in an
     *         initialization call)
     * @throws SQLException
     *             if the database could be neither opened or created
     */
    public CarsDBAdapter open() throws SQLException {
        this.mDbHelper = new DatabaseHelper(this.mCtx);
        this.mDb = this.mDbHelper.getWritableDatabase();
        return this;
    }

    /**
     * close return type: void
     */
    public void close() {
        this.mDbHelper.close();
    }

    /**
     * Create a new car. If the car is successfully created return the new
     * rowId for that car, otherwise return a -1 to indicate failure.
     * 
     * @param name
     * @param model
     * @param year
     * @return rowId or -1 if failed
     */
    public long createCar(String name, String model, String year){
        ContentValues initialValues = new ContentValues();
        initialValues.put(NAME, name);
        initialValues.put(MODEL, model);
        initialValues.put(YEAR, year);
        return this.mDb.insert(DATABASE_TABLE, null, initialValues);
    }

    /**
     * Delete the car with the given rowId
     * 
     * @param rowId
     * @return true if deleted, false otherwise
     */
    public boolean deleteCar(long rowId) {

        return this.mDb.delete(DATABASE_TABLE, ROW_ID + "=" + rowId, null) > 0; //$NON-NLS-1$
    }

    /**
     * Return a Cursor over the list of all cars in the database
     * 
     * @return Cursor over all cars
     */
    public Cursor getAllCars() {

        return this.mDb.query(DATABASE_TABLE, new String[] { ROW_ID,
                NAME, MODEL, YEAR }, null, null, null, null, null);
    }

    /**
     * Return a Cursor positioned at the car that matches the given rowId
     * @param rowId
     * @return Cursor positioned to matching car, if found
     * @throws SQLException if car could not be found/retrieved
     */
    public Cursor getCar(long rowId) throws SQLException {

        Cursor mCursor =

        this.mDb.query(true, DATABASE_TABLE, new String[] { ROW_ID, NAME,
                MODEL, YEAR}, ROW_ID + "=" + rowId, null, null, null, null, null);
        if (mCursor != null) {
            mCursor.moveToFirst();
        }
        return mCursor;
    }

    /**
     * Update the car.
     * 
     * @param rowId
     * @param name
     * @param model
     * @param year
     * @return true if the note was successfully updated, false otherwise
     */
    public boolean updateCar(long rowId, String name, String model,
            String year){
        ContentValues args = new ContentValues();
        args.put(NAME, name);
        args.put(MODEL, model);
        args.put(YEAR, year);

        return this.mDb.update(DATABASE_TABLE, args, ROW_ID + "=" + rowId, null) >0; 
    }

}
因此,我的主DBAdapter(负责在一个数据库中创建我的所有表)如下所示

public class DBAdapter {

    public static final String DATABASE_NAME = "stuffIOwn"; //$NON-NLS-1$

    public static final int DATABASE_VERSION = 1;

    private static final String CREATE_TABLE_CARS =
       "create table cars (_id integer primary key autoincrement, " //$NON-NLS-1$
    + CarsDBAdapter.NAME+ " TEXT," //$NON-NLS-1$
    + CarsDBAdapter.MODEL+ " TEXT," //$NON-NLS-1$
    + CarsDBAdapter.YEAR+ " TEXT" + ");"; //$NON-NLS-1$ //$NON-NLS-2$

    private static final String CREATE_TABLE_BOATS = "create table boats (_id integer primary key autoincrement, " //$NON-NLS-1$
    +BoatsDBAdapter.NAME+" TEXT," //$NON-NLS-1$
    +BoatsDBAdapter.MODEL+" TEXT," //$NON-NLS-1$
    +BoatsDBAdapter.YEAR+" TEXT"+ ");"; //$NON-NLS-1$  //$NON-NLS-2$

        private static final String CREATE_TABLE_CYCLES = "create table cycles (_id integer primary key autoincrement, " //$NON-NLS-1$
    +CyclesDBAdapter.NAME+" TEXT," //$NON-NLS-1$
    +CyclesDBAdapter.MODEL+" TEXT," //$NON-NLS-1$
    +CyclesDBAdapter.YEAR+" TEXT"+ ");"; //$NON-NLS-1$  //$NON-NLS-2$


    private final Context context; 
    private DatabaseHelper DBHelper;
    private SQLiteDatabase db;

    /**
     * Constructor
     * @param ctx
     */
    public DBAdapter(Context ctx)
    {
        this.context = ctx;
        this.DBHelper = new DatabaseHelper(this.context);
    }

    private static class DatabaseHelper extends SQLiteOpenHelper 
    {
        DatabaseHelper(Context context) 
        {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) 
        {
            db.execSQL(CREATE_TABLE_CARS);
            db.execSQL(CREATE_TABLE_BOATS);
            db.execSQL(CREATE_TABLE_CYCLES);           
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, 
        int newVersion) 
        {               
            // Adding any table mods to this guy here
        }
    } 

   /**
     * open the db
     * @return this
     * @throws SQLException
     * return type: DBAdapter
     */
    public DBAdapter open() throws SQLException 
    {
        this.db = this.DBHelper.getWritableDatabase();
        return this;
    }

    /**
     * close the db 
     * return type: void
     */
    public void close() 
    {
        this.DBHelper.close();
    }
}

DBAdapter类仅在应用程序首次启动时被调用,其唯一职责是创建/升级表。所有其他对数据的访问都是通过单个“适配器”完成的类。我发现它工作得很好,不会产生我前面提到的版本控制问题。

哦,好的,但是在汽车、船只和自行车类中,我不确定应该声明哪个适配器。我应该在3个类中声明DBAdapter类吗?我真的需要帮助。我无法将表插入数据库。我是什么在非DBAdapter类中编码?