2015-09-06 84 views
0

我有一个大约15MB的数据(太大,无法存储在每个设备上)的SQLite数据库。我正在构建一个应用程序来与这些数据进行交互。如何从应用程序的存储位置访问数据库。我不是要求某人为我做这件事,但我该怎么去研究如何做到这一点。是否有一个android模块在传递一个ip地址(或FTP服务器IP?)之后执行此操作?我在哪里开始研究托管我的数据库的最佳方式,然后将其链接到我的应用程序?这是如何完成的高层简介?谢谢!从Android应用程序访问外部数据库

+2

[网络服务](https://en.wikipedia.org/wiki/Web_service)已经存在了15年以上,是当今大多数主要网站和移动应用程序的基础。 – CommonsWare

回答

1

两种方式

  1. 您可以将查询发送到Web服务器和检索结果(你需要接受查询并通过HTTP发送结果Web服务器URL)。

  2. 您可以下载数据库并将其放入应用程序数据库目录,然后您可以查询此数据库。

1

试试这个,

把你externalDB文件夹资产并打开此文件,并在数据库中编写,然后访问它请看下面的例子中资产的文件夹我的externalDB文件。

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 

<Button android:id="@+id/button01" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Copy Database"> 
     </Button> 

</LinearLayout> 

DatabaseHelper.java

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




import android.content.Context; 
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; 

public class DatabaseHelper extends SQLiteOpenHelper{ 

    //The Android's default system path of your application database. 
    String DB_PATH =null; 

    private static String DB_NAME = "extenalDB"; 

    private SQLiteDatabase myDataBase; 

    private final Context myContext; 

    /** 
    * Constructor 
    * Takes and keeps a reference of the passed context in order to access to the application assets and resources. 
    * @param context 
    */ 
    public DatabaseHelper(Context context) { 

     super(context, DB_NAME, null, 1); 
     this.myContext = context; 
     DB_PATH="/data/data/"+context.getPackageName()+"/"+"databases/"; 
    } 

    /** 
    * Creates a empty database on the system and rewrites it with your own database. 
    * */ 
    public void createDataBase() throws IOException{ 

     boolean dbExist = checkDataBase(); 

     if(dbExist){ 
      //do nothing - database already exist 
     }else{ 

      //By calling this method and empty database will be created into the default system path 
       //of your application so we are gonna be able to overwrite that database with our database. 
      this.getReadableDatabase(); 

      try { 

       copyDataBase(); 

      } catch (IOException e) { 

       throw new Error("Error copying database"); 

      } 
     } 

    } 

    /** 
    * Check if the database already exist to avoid re-copying the file each time you open the application. 
    * @return true if it exists, false if it doesn't 
    */ 
    private boolean checkDataBase(){ 

     SQLiteDatabase checkDB = null; 

     try{ 
      String myPath = DB_PATH + DB_NAME; 
      checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

     }catch(SQLiteException e){ 

      //database does't exist yet. 

     } 

     if(checkDB != null){ 

      checkDB.close(); 

     } 
     Log.v("check DB", ""+checkDB); 

     return checkDB != null ? true : false; 
    } 

    /** 
    * Copies your database from your local assets-folder to the just created empty database in the 
    * system folder, from where it can be accessed and handled. 
    * This is done by transfering bytestream. 
    * */ 
    private void copyDataBase() throws IOException{ 

     //Open your local db as the input stream 
     InputStream myInput = myContext.getAssets().open(DB_NAME); 

     // Path to the just created empty db 
     String outFileName = DB_PATH + DB_NAME; 

     //Open the empty db as the output stream 
     OutputStream myOutput = new FileOutputStream(outFileName); 

     //transfer bytes from the inputfile to the outputfile 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = myInput.read(buffer))>0){ 
      myOutput.write(buffer, 0, length); 
//   Log.v("read", "1"+myInput.read(buffer)); 
     } 

     //Close the streams 
     myOutput.flush(); 
     myOutput.close(); 
     myInput.close(); 

    } 

    public void openDataBase() throws SQLException{ 

     //Open the database 
     String myPath = DB_PATH + DB_NAME; 
     myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 

    } 

    @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) { 

    } 
//return cursor 
    public Cursor query(String table,String[] columns, String selection,String[] selectionArgs,String groupBy,String having,String orderBy){ 
     return myDataBase.query("EMP_TABLE", null, null, null, null, null, null); 


    } 
} 

Main.java

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

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
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.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

public class CopyDbActivity extends Activity { 
    /** Called when the activity is first created. */ 
    Cursor c=null; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     ((Button)findViewById(R.id.button01)).setOnClickListener(new View.OnClickListener(){ 
      @Override 
      public void onClick(View v) { 


       DatabaseHelper myDbHelper = new DatabaseHelper(CopyDbActivity.this); 
       try { 

        myDbHelper.createDataBase(); 

      } catch (IOException ioe) { 

       throw new Error("Unable to create database"); 

      } 

      try { 

       myDbHelper.openDataBase(); 

      }catch(SQLException sqle){ 

       throw sqle; 

      } 
      Toast.makeText(CopyDbActivity.this, "Success", Toast.LENGTH_SHORT).show(); 



      c=myDbHelper.query("EMP_TABLE", null, null, null, null,null, null); 
      if(c.moveToFirst()) 
      { 
       do { 

        Toast.makeText(CopyDbActivity.this, 
          "_id: " + c.getString(0) + "\n" + 
          "E_NAME: " + c.getString(1) + "\n" + 
          "E_AGE: " + c.getString(2) + "\n" + 
          "E_DEPT: " + c.getString(3), 
          Toast.LENGTH_LONG).show(); 

       } while (c.moveToNext()); 
      } 
      } 
     }); 



    } 
} 

竭诚为您服务。

相关问题