在项目中用SQLite数据库,数据库文件放在哪里啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在项目中用SQLite数据库,数据库文件放在哪里啊?相关的知识,希望对你有一定的参考价值。

我用sqlitemanager建了一个数据库,data.sqlite,导入了数据,请问现在我要在android中用这些数据,我把文件直接拷到了Android Project 的RES目录下,结果现在项目报错,不能运行,请问要怎么用这个数据库文件啊?为什么生成的数据库文件不是data.db呢?要放在哪里Android Project才能用?

要在Android系统中操作SQLite数据库,是通过Android的核心类SQLiteDatabase类来实现的,通常情况下为了数据库升级的需要以及使用方便,我们会选择继承SQLiteOpenHelper抽像类,但是SQLiteOpenHelper会将数据库文件创建在一个固定的目录(内存的/data/data/<package name/databases>目录中),如果你想使用已经存在的数据库文件也就是说数据库会和程序一起发布,就得通过使用SQLiteDabase的静态方法OpenOrCreateDatabase()方法来得到SQLiteDabase对象,下面是一个具体操作类:
package net.my.dao;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import net.my.jokebook.R;
import android.app.Activity;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
public class DBHelper 
//得到SD卡路径
private final String DATABASE_PATH = android.os.Environment
.getExternalStorageDirectory().getAbsolutePath()
+ "/joke"; 
private final Activity activity;
//数据库名
private final String DATABASE_FILENAME;
public DBHelper(Context context) 
    // TODO Auto-generated constructor stub
//这里直接给数据库名
  DATABASE_FILENAME = "jokebook.db3";
  activity = (Activity)context;
 
//得到操作数据库的对象
public  SQLiteDatabase openDatabase()

  try
  
   boolean b = false;
   //得到数据库的完整路径名
   String databaseFilename = DATABASE_PATH + "/" + DATABASE_FILENAME;
//将数据库文件从资源文件放到合适地方(资源文件也就是数据库文件放在项目的res下的raw目录中)
   //将数据库文件复制到SD卡中   File dir = new File(DATABASE_PATH);
   if (!dir.exists())
     b = dir.mkdir();
   //判断是否存在该文件
   if (!(new File(databaseFilename)).exists())
        
    //不存在得到数据库输入流对象
    InputStream is = activity.getResources().openRawResource(
      R.raw.jokebook);
    //创建输出流
    FileOutputStream fos = new FileOutputStream(databaseFilename);
    //将数据输出
    byte[] buffer = new byte[8192];
    int count = 0;
    while ((count = is.read(buffer)) > 0)
    
     fos.write(buffer, 0, count);
    
    //关闭资源
    fos.close();
    is.close();
   
//得到SQLDatabase对象
   SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(
     databaseFilename, null);   
   return database;   
  
  catch (Exception e)
  
   System.out.println(e.getMessage());
  
  return null;


写完这个类之后,就能得到SQLiteDatabase对象,就能对数据库操作了

参考技术A

Before trying this code, please find this line in below code:

    private static String DB_NAME ="YourDbName";// Database name

DB_NAME here is the name of your database. It is assumed that you have a copy of the database in the assets folder, so for example if your database name is ordersDB, then the value of DB_NAME will be ordersDB,

    private static String DB_NAME ="ordersDB";

Keep the Database in assets folder & then follow below:

DataHelper class:

    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;

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

    public class DataBaseHelper extends SQLiteOpenHelper

    private static String TAG = "DataBaseHelper"; // Tag just for the LogCat window
    //destination path (location) of our database on device
    private static String DB_PATH = "";
    private static String DB_NAME ="YourDbName";// Database name
    private SQLiteDatabase mDataBase;
    private final Context mContext;

    public DataBaseHelper(Context context)

       super(context, DB_NAME, null, 1);// 1? its Database Version
       if(android.os.Build.VERSION.SDK_INT >= 4.2)
          DB_PATH = context.getApplicationInfo().dataDir + "/databases/";        
       
       else
       
          DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
       
       this.mContext = context;
     

    public void createDataBase() throws IOException

       //If database not exists copy it from the assets

       boolean mDataBaseExist = checkDataBase();
       if(!mDataBaseExist)
       
           this.getReadableDatabase();
           this.close();
           try
           
               //Copy the database from assests
               copyDataBase();
               Log.e(TAG, "createDatabase database created");
           
           catch (IOException mIOException)
           
               throw new Error("ErrorCopyingDataBase");
           
       

       //Check that the database exists here: /data/data/your package/databases/Da Name
       private boolean checkDataBase()
       
           File dbFile = new File(DB_PATH + DB_NAME);
           //Log.v("dbFile", dbFile + "   "+ dbFile.exists());
           return dbFile.exists();
       

       //Copy the database from assets
       private void copyDataBase() throws IOException
       
           InputStream mInput = mContext.getAssets().open(DB_NAME);
           String outFileName = DB_PATH + DB_NAME;
           OutputStream mOutput = new FileOutputStream(outFileName);
           byte[] mBuffer = new byte[1024];
           int mLength;
           while ((mLength = mInput.read(mBuffer))>0)
           
               mOutput.write(mBuffer, 0, mLength);
           
           mOutput.flush();
           mOutput.close();
           mInput.close();
       

       //Open the database, so we can query it
       public boolean openDataBase() throws SQLException
       
           String mPath = DB_PATH + DB_NAME;
           //Log.v("mPath", mPath);
           mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY);
           //mDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
           return mDataBase != null;
       

       @Override
       public synchronized void close()
       
           if(mDataBase != null)
               mDataBase.close();
           super.close();
       

Write a DataAdapter class like:

    import java.io.IOException;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.util.Log;

    public class TestAdapter

       protected static final String TAG = "DataAdapter";

       private final Context mContext;
       private SQLiteDatabase mDb;
       private DataBaseHelper mDbHelper;

       public TestAdapter(Context context)
       
           this.mContext = context;
           mDbHelper = new DataBaseHelper(mContext);
       

       public TestAdapter createDatabase() throws SQLException
       
           try
           
               mDbHelper.createDataBase();
           
           catch (IOException mIOException)
           
               Log.e(TAG, mIOException.toString() + "  UnableToCreateDatabase");
               throw new Error("UnableToCreateDatabase");
           
           return this;
       

       public TestAdapter open() throws SQLException
       
           try
           
               mDbHelper.openDataBase();
               mDbHelper.close();
               mDb = mDbHelper.getReadableDatabase();
           
           catch (SQLException mSQLException)
           
               Log.e(TAG, "open >>"+ mSQLException.toString());
               throw mSQLException;
           
           return this;
       

       public void close()
       
           mDbHelper.close();
       

        public Cursor getTestData()
       
            try
           
                String sql ="SELECT * FROM myTable";

                Cursor mCur = mDb.rawQuery(sql, null);
                if (mCur!=null)
               
                   mCur.moveToNext();
               
                return mCur;
           
            catch (SQLException mSQLException)
           
                Log.e(TAG, "getTestData >>"+ mSQLException.toString());
                throw mSQLException;
           
       

Now you can use it like:

    TestAdapter mDbHelper = new TestAdapter(urContext);        
    mDbHelper.createDatabase();      
    mDbHelper.open();

    Cursor testdata = mDbHelper.getTestData();

    mDbHelper.close();

NOTE:

    For Jellybean 4.2 change:
    DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
    to:

    DB_PATH = context.getApplicationInfo().dataDir + "/databases/";
    in the DataHelper class this code will work on JB 4.2 multi users.

参考技术B 使用SQLiteOpenHelper的好处就是随着你应用的卸载数据库也一同卸载的,如果是拷入Sdcard的话还得代码操作。。。 参考技术C 如果你放在res中是找不到的 去搜个关于操作SQLiteOpenHelper的小DEMO. 参考技术D 如果你是通过SQLiterOpenHelper创建的应该在Data\data\你的包名里面的database里面

项目中用到的SQLite,你能自己动手实现吗

阅读完成需要

5分钟

在日常的Android开发过程中,有些项目是直接从服务器获取数据,不需要在本地存储,而有些项目则需要先将数据存储到本地,用时直接从本地获取,如果本地没有,再从服务器获取。

项目中存储数据,一般都会用到数据库,目前网上开源的并且非常好用的数据库也不少,诸如GreenDAO,ORMLite,LitePal,Realm等,在github上也都是有超過2k的star的。

不可否认,这些封装好的数据库非常好用,只需要简单的集成,就可以通过一些api的调用来使用了,至于如何实现数据的存储,如何进行增删改查,这些都已经封装好了,不需要使用者去实现。

无有疑问,这些开源的三方数据库,给我们日常的开发带来了极大的便捷,减少了我们自己去造轮子的烦恼,感谢那些开源的贡献者们,不过,用归用,我们也不能只知其然,不知其所以然。

如果有一天,面试的时候,面试官问你平时项目中用的是什么数据库,你可能会一脸自信的说greendao,接着面试官笑嘻嘻的问到,能说说greendao的底层是怎么实现的吗?这时,提前复习过的你可能也会一脸自信的把greendao的源码讲一遍,然后内心深处得意洋洋的窃喜道,小样,难不住我吧!

此时,面试官脸色一变道,看来你对数据库了解的还可以啊,那能手动去实现一个sqllite数据库吗?这时,你还能再一脸自信的去写出来吗?

当然能!只要你看了这篇文章,你仍然可以一脸自信的去实现一个sqllite数据库。

好了,扯了这么多,就让我们一起去学习如何手动去实现一个sqllite数据库吧!

Android 为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper 帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。

public class MyDataBaseHelper extends SQLiteOpenHelper {
    private Context mContext;
    public static final String CREATE_BOOK="create table Book ("+"id integer primary key autoincrement,"
    +"author text,"
    +"price real,"
    +"pages integer,"
    +"name text)";

    public MyDataBaseHelper( Context context,  String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext=context;
    }

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

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

    }
}

可以看到我创建了一个书本类的表,id属于自增长型的,作者,书名是文本类型,页码是Integer类型,价格是浮点型的。

SQLiteOpenHelper 中有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。

SQLiteOpenHelper 中 还 有 两 个 非 常 重 要 的 实 例 方 法 , getReadableDatabase() 和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而 getWritableDatabase()方法则将出现异常。

下面让我们创建一个DB类,来封装我们的数据库操作。

public class MyDataBaseDB {
    /**
     * 数据库名
     */


    public static final String DB_NAME = "book";

    /**
     * 数据库版本
     */


    public static final int VERSION = 1;

    private static MyDataBaseDB   myDataBaseDB;
    private        SQLiteDatabase db;

    /**
     * 私有化构造方法
     */


    private MyDataBaseDB(Context context{
        MyDataBaseHelper dbHelper = new MyDataBaseHelper(context, DB_NAME, null, VERSION);
        db = dbHelper.getWritableDatabase();
    }

    /**
     * 获取DB的实例
     */

    public synchronized static MyDataBaseDB getInstance(Context context{
        if (myDataBaseDB == null) {
            myDataBaseDB = new MyDataBaseDB(context);
        }

        return myDataBaseDB;
    }


    /**
     * 数据增加
     */


    public void add(Book book{
        if (book != null) {
            ContentValues values = new ContentValues();
            values.put("name", book.getName());
            values.put("author", book.getAuthor());
            values.put("price", book.getPrice());
            values.put("pages", book.getPages());
            db.insert("Book"null, values);
        }
    }

    /**
     * 更新数据
     * 这里只是写个更新价格的操作,具体更新还是要根据项目中的实际情况去自行实现
     */


    public void update(Book book{
        ContentValues values = new ContentValues();
        values.put("price""2.20");
        db.update("Book", values, "name=?"new String[]{book.getName()});
    }

    /**
     * 删除数据
     * 这里也只是写一个删除书的页数大于1000页的书,具体实现根据项目需求
     */


    public void delete(Book book{
        db.delete("Book""pages > ?"new String[]{"1000"});
    }

    /**
     * 查数据
     */


    public List<Book> getBook({
        List<Book> list = new ArrayList<>();
        Cursor cursor = db.query("Book"nullnullnullnullnullnull);
        if (cursor.moveToFirst()) {
            do {
                Book book = new Book();
                book.setId(cursor.getInt(cursor.getColumnIndex("id")));
                book.setName(cursor.getString(cursor.getColumnIndex("name")));
                book.setPrice(cursor.getDouble(cursor.getColumnIndex("price")));
                book.setAuthor(cursor.getString(cursor.getColumnIndex("author")));
                book.setPages(cursor.getInt(cursor.getColumnIndex("pages")));

                list.add(book);
            } while (cursor.moveToNext());
        }
        return list;
    }
}

好了,到这里,SQLite的创建以及增删改查就学习的差不多了,项目中使用时,只需要实例化MydataBaseDB,然后调用就可以了,至于数据库的升级,外联等知识,我们以后再学。

更多精彩内容,请随手关注IT烟酒僧

这里有酒,也有故事,有代码,有人生,有眼前的苟且,也有诗和远方

END


更多推荐阅读:













以上是关于在项目中用SQLite数据库,数据库文件放在哪里啊?的主要内容,如果未能解决你的问题,请参考以下文章

知不知道.lib文件放在系统文件哪里才能执行啊?

在电子生产模式下将 SQLITE db 文件存储在哪里?

项目中用到的SQLite,你能自己动手实现吗

Eclipse的src文件在哪里啊?

Xampp 服务器中的所有 php 项目应该放在哪里?

这个 Rails 文件存储在哪里? db/development.sqlite3