Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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
Java 填充SQLite数据库_Java_Android_Sqlite - Fatal编程技术网

Java 填充SQLite数据库

Java 填充SQLite数据库,java,android,sqlite,Java,Android,Sqlite,我不太熟悉android sqlite数据库。我对填充sqlite数据库只有粗略的概念。我听了一些教程,但它们讲述了不同的事情。 我有一个android项目,它的一个包是.db 这个包由5个不同的类组成。它们是: DataAdapter.java DataBaseHelper.java DBAdapter.java LoadDBActivity.java 选择dbadapter.java 我知道SelectDBAdapter类用于从数据库中选择数据。我的数据库位于.jpeg格式的资产文件夹中。我

我不太熟悉android sqlite数据库。我对填充sqlite数据库只有粗略的概念。我听了一些教程,但它们讲述了不同的事情。 我有一个android项目,它的一个包是.db 这个包由5个不同的类组成。它们是:

  • DataAdapter.java
  • DataBaseHelper.java
  • DBAdapter.java
  • LoadDBActivity.java
  • 选择dbadapter.java
  • 我知道SelectDBAdapter类用于从数据库中选择数据。我的数据库位于.jpeg格式的资产文件夹中。我可以从sqliteBrowser打开它。 实际上,我想知道的是为什么我们要使用这些不同的类?每节课的目的是什么

    我真的很抱歉,我不能张贴代码,因为这个项目属于另一个人(我的朋友)。
    如果有人能如此友好地解释使用这些不同类的含义,以及我们为什么要使用这样一个senario,我将不胜感激

    填充数据库有多种方法。我要做的是在DBAdapter类中创建一个
    insert(ObjectType objectName)
    。也就是说,我创建了一个对象类,在这个例子中,我将使用授权人员

    public class AuthorizedPersonnelClass {
    
      private String _id;
      private String Last_Name;
      private String Middle_Name;
      private String First_Name;
      private String Store_ID;
      private String Status;
      private String New_Personnel;
    
          //of course insert your 2 constructors and getter setter methods here
    }
    
    在DBAdapter中,我将创建
    insert(AuthorizedPersonnelClass authorizedPersonnel)
    方法来处理数据插入:

    public long addPersonnel(AuthorizedPersonnelClass authorizedPersonnel){
        ContentValues values = new ContentValues();
    
        values.put(AUTHORIZEDPERSONNEL_ID, authorizedPersonnel.get_id());
        values.put(L_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getLast_Name());
        values.put(M_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getMiddle_Name());
        values.put(F_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getFirst_Name());
        values.put(STATUS, authorizedPersonnel.getStatus());
        values.put(STORE_ID, authorizedPersonnel.getStore_ID());
        values.put(NEW, authorizedPersonnel.getNew_Personnel());
    
        return this.mDB.insert(TABLE_AUTHORIZED_PERSONNEL, null, values);
    }
    
    从这里开始,假设我想在我的
    onCreate()
    函数或按钮调用中填充条目,我将这样做:

    //instantiate a global variable for the DBAdapter
    DBAdapter db = new DBAdapter(this);
    
    //then if you want to insert 
    db.insert(new AuthorizedPersonnelClass( /*insert variables here*/ ));
    
    当然,这些值可能是硬编码的或用户输入的(只需使用EditText并提取字符串并在那里使用它们)


    在这里,我使用了
    ContentValues
    示例,因为对于初学者来说,使用它比使用rawQuery Insert语句更容易,这可能会让人困惑。

    填充数据库有多种方法。我要做的是在DBAdapter类中创建一个
    insert(ObjectType objectName)
    。也就是说,我创建了一个对象类,在这个例子中,我将使用授权人员

    public class AuthorizedPersonnelClass {
    
      private String _id;
      private String Last_Name;
      private String Middle_Name;
      private String First_Name;
      private String Store_ID;
      private String Status;
      private String New_Personnel;
    
          //of course insert your 2 constructors and getter setter methods here
    }
    
    在DBAdapter中,我将创建
    insert(AuthorizedPersonnelClass authorizedPersonnel)
    方法来处理数据插入:

    public long addPersonnel(AuthorizedPersonnelClass authorizedPersonnel){
        ContentValues values = new ContentValues();
    
        values.put(AUTHORIZEDPERSONNEL_ID, authorizedPersonnel.get_id());
        values.put(L_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getLast_Name());
        values.put(M_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getMiddle_Name());
        values.put(F_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getFirst_Name());
        values.put(STATUS, authorizedPersonnel.getStatus());
        values.put(STORE_ID, authorizedPersonnel.getStore_ID());
        values.put(NEW, authorizedPersonnel.getNew_Personnel());
    
        return this.mDB.insert(TABLE_AUTHORIZED_PERSONNEL, null, values);
    }
    
    从这里开始,假设我想在我的
    onCreate()
    函数或按钮调用中填充条目,我将这样做:

    //instantiate a global variable for the DBAdapter
    DBAdapter db = new DBAdapter(this);
    
    //then if you want to insert 
    db.insert(new AuthorizedPersonnelClass( /*insert variables here*/ ));
    
    当然,这些值可能是硬编码的或用户输入的(只需使用EditText并提取字符串并在那里使用它们)


    在这里,我使用了
    ContentValues
    示例,因为对于初学者来说,使用它比使用rawQuery Insert语句更容易,这可能会让人困惑。

    填充数据库有多种方法。我要做的是在DBAdapter类中创建一个
    insert(ObjectType objectName)
    。也就是说,我创建了一个对象类,在这个例子中,我将使用授权人员

    public class AuthorizedPersonnelClass {
    
      private String _id;
      private String Last_Name;
      private String Middle_Name;
      private String First_Name;
      private String Store_ID;
      private String Status;
      private String New_Personnel;
    
          //of course insert your 2 constructors and getter setter methods here
    }
    
    在DBAdapter中,我将创建
    insert(AuthorizedPersonnelClass authorizedPersonnel)
    方法来处理数据插入:

    public long addPersonnel(AuthorizedPersonnelClass authorizedPersonnel){
        ContentValues values = new ContentValues();
    
        values.put(AUTHORIZEDPERSONNEL_ID, authorizedPersonnel.get_id());
        values.put(L_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getLast_Name());
        values.put(M_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getMiddle_Name());
        values.put(F_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getFirst_Name());
        values.put(STATUS, authorizedPersonnel.getStatus());
        values.put(STORE_ID, authorizedPersonnel.getStore_ID());
        values.put(NEW, authorizedPersonnel.getNew_Personnel());
    
        return this.mDB.insert(TABLE_AUTHORIZED_PERSONNEL, null, values);
    }
    
    从这里开始,假设我想在我的
    onCreate()
    函数或按钮调用中填充条目,我将这样做:

    //instantiate a global variable for the DBAdapter
    DBAdapter db = new DBAdapter(this);
    
    //then if you want to insert 
    db.insert(new AuthorizedPersonnelClass( /*insert variables here*/ ));
    
    当然,这些值可能是硬编码的或用户输入的(只需使用EditText并提取字符串并在那里使用它们)


    在这里,我使用了
    ContentValues
    示例,因为对于初学者来说,使用它比使用rawQuery Insert语句更容易,这可能会让人困惑。

    填充数据库有多种方法。我要做的是在DBAdapter类中创建一个
    insert(ObjectType objectName)
    。也就是说,我创建了一个对象类,在这个例子中,我将使用授权人员

    public class AuthorizedPersonnelClass {
    
      private String _id;
      private String Last_Name;
      private String Middle_Name;
      private String First_Name;
      private String Store_ID;
      private String Status;
      private String New_Personnel;
    
          //of course insert your 2 constructors and getter setter methods here
    }
    
    在DBAdapter中,我将创建
    insert(AuthorizedPersonnelClass authorizedPersonnel)
    方法来处理数据插入:

    public long addPersonnel(AuthorizedPersonnelClass authorizedPersonnel){
        ContentValues values = new ContentValues();
    
        values.put(AUTHORIZEDPERSONNEL_ID, authorizedPersonnel.get_id());
        values.put(L_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getLast_Name());
        values.put(M_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getMiddle_Name());
        values.put(F_NAME_AUTHORIZED_PERSONNEL, authorizedPersonnel.getFirst_Name());
        values.put(STATUS, authorizedPersonnel.getStatus());
        values.put(STORE_ID, authorizedPersonnel.getStore_ID());
        values.put(NEW, authorizedPersonnel.getNew_Personnel());
    
        return this.mDB.insert(TABLE_AUTHORIZED_PERSONNEL, null, values);
    }
    
    从这里开始,假设我想在我的
    onCreate()
    函数或按钮调用中填充条目,我将这样做:

    //instantiate a global variable for the DBAdapter
    DBAdapter db = new DBAdapter(this);
    
    //then if you want to insert 
    db.insert(new AuthorizedPersonnelClass( /*insert variables here*/ ));
    
    当然,这些值可能是硬编码的或用户输入的(只需使用EditText并提取字符串并在那里使用它们)


    在这里,我使用了
    ContentValues
    示例,因为初学者更容易使用它,而不是使用可能会让人困惑的rawQuery Insert语句。

    根据我的开发经验,我总是喜欢在/res/raw文件夹中添加一个准备好的sqlite数据库文件。使用Firefox的sqlite Manager插件创建/管理sqlite数据库,这是一个很棒的工具。这个方法真的很棒,因为

    • 首先,我不需要为创建/管理数据库编写大量代码
    • 最重要的是,有些应用程序需要从预先填充的数据库中读取数据。我不需要关心应用程序需要什么以及数据库是空的还是已满的。这是万能的。我只需要编写一些运行所需简单SQL的方法
    这是我自己定制的DatabaseHelper类。要使用这个类,您需要遵循一些说明

  • 如果sqlite数据库大小超过1MB,那么将文件分割成块,我更喜欢512KB的块,并将它们放在/res/raw目录中
  • 在下面的类中编辑包名和db文件名

    package your.packagee.name;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import android.content.Context;
    import android.content.res.Resources;
    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;
    import android.widget.Toast;
    
    public class DataBaseHelper extends SQLiteOpenHelper {
    
    private static final String pkg = "your package name";
    private static String DB_PATH = "/data/data/" + pkg + "/databases/";
    
    private static String DB_NAME = "yourDBFile.sqlite";
    int[] dbfiles = { R.raw.chunk1 , R.raw.chunk2 ..... };
    
     private SQLiteDatabase myDataBase;
    private final Context myContext;
    
    public DataBaseHelper(Context context) {
        super(context, DB_NAME, null, 1);
        this.myContext = context;
    }
    
    public void createDataBase() {
    
        boolean dbExist = checkDataBase();
    
        if (dbExist) {
            // do nothing - database already exist
        } else {
            this.getReadableDatabase();
            try {
                CopyDataBase();
            } catch (IOException e) {
                Toast.makeText(myContext, e.getMessage(), Toast.LENGTH_SHORT)
                        .show();
                Log.d("Create DB", e.getMessage());
            }
        }
    
    }
    
    private boolean checkDataBase() {
        SQLiteDatabase checkDB = null;
        try {
            String myPath = DB_PATH + DB_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null,
                    SQLiteDatabase.NO_LOCALIZED_COLLATORS);
        } catch (SQLiteException e) {
            Toast.makeText(myContext, e.getMessage(), Toast.LENGTH_SHORT)
                    .show();
            Log.d("Check DB", e.getMessage());
        }
    
        if (checkDB != null) {
            checkDB.close();
        }
        return checkDB != null ? true : false;
    }
    
    private void CopyDataBase() throws IOException {
        InputStream databaseInput = null;
        Resources resources = myContext.getResources();
        String outFileName = DB_PATH + DB_NAME;
    
        OutputStream databaseOutput = new FileOutputStream(outFileName);
    
        byte[] buffer = new byte[512];
        int length;
    
        for (int i = 0; i < dbfiles.length; i++) {
            databaseInput = resources.openRawResource(dbfiles[i]);
            while ((length = databaseInput.read(buffer)) > 0) {
                databaseOutput.write(buffer, 0, length);
                databaseOutput.flush();
            }
            databaseInput.close();
        }
    
        databaseOutput.flush();
        databaseOutput.close();
    }
    
    public void openDataBase() throws SQLException {
        String myPath = DB_PATH + DB_NAME;
        myDataBase = SQLiteDatabase.openDatabase(myPath, null,
                SQLiteDatabase.NO_LOCALIZED_COLLATORS);
    }
    
    @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) {
    
    }
    
    public boolean deleteItem (String ID){
    
        String query = "delete from item where id='" + ID + "'"  ;
        Log.d("Query : ", query);
        try{
            myDataBase.execSQL(query);
            return true ;
        } catch (Exception e){
            Log.d("Exception", e.toString());
            return false ;
        }
    }
    
    public Cursor getSearchFromID(String id) {
        return myDataBase.rawQuery("select * from item where id = \"" + id + "\"", null);
    }
    
    public boolean addSave(String type, String data , String time) {
    
        String query = "insert into item (type, data , timestamp) values ('" + type
        + "', '" + data + "', '" + time + "')"; 
    try {
       myDataBase.execSQL(query);
       return true ;
    } catch (Exception e) {
       return false ;
    }
    }
    }
    
    然后只使用DatabaseHelper类中编写的方法。样品是这样的

     String id = "1";
        DataBaseHelper helper = new DataBaseHelper(this);
        helper.openDataBase();
        Cursor c = helper.getSearchFromID(id);
        if(c.getCount() > 0){
            c.moveToFirst();
    
          while(!c.isAfterLast()){
            // extract your data from cursor
            c.MoveToNext();
          }
        }
    

    希望它能解决你在安卓系统中关于sqlite数据库的所有问题。至少对我来说它解决了。谢谢。

    根据我的开发经验,我总是喜欢在/res/raw文件夹中添加一个准备好的sqlite数据库文件。使用Firefox的sqlite Manager插件创建/管理sqlite数据库,这是一个很棒的工具。这个方法真的很棒,因为

    • 首先,我不需要为创建/管理数据库编写大量代码
    • 最重要的是,有些应用程序需要从预先填充的数据库中读取数据。我不需要关心应用程序是什么