2

Я пытаюсь передать содержимое базы данных, которую я создал для другого действия, путем использования AsyncTask, где будет отображаться содержимое базы данных. Запрос будет использоваться для указания данных, которые будут отображаться с помощью кнопки запроса. Мне было интересно, как я могу передать информацию о базе данных в другую деятельность. Это то, что у меня есть до сих пор.Передача базы данных в другую деятельность с помощью намерения

package com.dwolford.project9; 

import android.app.Activity; 
import android.content.ContentValues; 
import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 


public class Main extends Activity { 

Button quit; 
Button query; 
Button create; 
String FILENAME = ""; 
SQLDatabase db;//possibly use asynctask 
String sQuery = ""; 
EditText queryText; 

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

    db = new SQLDatabase(this);//Use asynctask? 



    create = (Button)findViewById(R.id.create); 
    create.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      boolean isInserted = db.insertDataS("S01", "Smith", "London"); 
      if(isInserted == true) 
       Toast.makeText(Main.this, "Data inserted", Toast.LENGTH_LONG).show(); 
      else 
       Toast.makeText(Main.this, "Data not inserted", Toast.LENGTH_LONG).show(); 

      new createTask().execute(FILENAME); 
     } 
    }); 

    queryText = (EditText)findViewById(R.id.selectQuery); 

    query = (Button)findViewById(R.id.query); 
    query.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(Main.this,execute_query.class); 
      sQuery = queryText.getText().toString(); 

      //intent.putExtra("database", db); 
      intent.putExtra("queryChoice", sQuery); 
      startActivity(intent); 
     } 
    }); 

    quit = (Button)findViewById(R.id.quit); 
    quit.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      finish(); 
     } 
    }); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 


public void AddData()//Add to asynctask? 
{ 

} 



public class createTask extends AsyncTask<String, Integer, String> 
{ 
    @Override 
    protected String doInBackground(String... params) 
    { 
     return null; 
    } 

} 


public class SQLDatabase extends SQLiteOpenHelper{ 

    public static final String SPdb = "SPdb.db"; 
    public static final String s = "s";//First table name 
    public static final String sno = "sno"; 
    public static final String sname = "sname"; 
    public static final String city = "city"; 
    public static final String p = "p"; 
    public static final String pno = "pno"; 
    public static final String pname = "pname"; 
    public static final String cost = "cost"; 
    public static final String sp = "sp"; 
    public static final String qty = "qty"; 


    public SQLDatabase(Context context) { 
     super(context, SPdb, null, 1); 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE " + s + "(sno TEXT  PRIMARY KEY COLLATE NOCASE,\n" + 
       " sname TEXT  NOT NULL COLLATE NOCASE,\n" + 
       " city TEXT  NOT NULL COLLATE NOCASE\n)"); 

     db.execSQL("CREATE TABLE " + p + "(pno TEXT  NOT NULL COLLATE NOCASE,\n" + 
       " pname TEXT  NOT NULL COLLATE NOCASE,\n" + 
       " cost REAL  NOT NULL,\n" + 
       " city TEXT  NOT NULL COLLATE NOCASE,\n" + 
       "\n" + 
       " PRIMARY KEY (pno)\n)"); 

     db.execSQL("CREATE TABLE " + sp + "(sno  TEXT  NOT NULL REFERENCES s(sno) COLLATE NOCASE,\n" + 
       " pno  TEXT  NOT NULL COLLATE NOCASE,\n" + 
       " qty  INTEGER NOT NULL,\n" + 
       "\n" + 
       " FOREIGN KEY (pno) REFERENCES p(pno)\n)"); 

     //db.execSQL("create table " =); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     db.execSQL("DROP TABLE IF EXISTS " +s); 
     db.execSQL("DROP TABLE IF EXISTS " +p); 
     db.execSQL("DROP TABLE IF EXISTS " +sp); 
     onCreate(db);//Create table in database 
    } 


    public boolean insertDataS(String sno, String sname, String city) 
    { 
     SQLiteDatabase db = this.getWritableDatabase();//Maybe readable 
     ContentValues contentValue = new ContentValues(); 
     contentValue.put(this.sno, sno); 
     contentValue.put(this.sname, sname); 
     contentValue.put(this.city, city); 
     long result = db.insert(s, null, contentValue); 
     if(result == -1) 
     { 
      return false; 
     } 
     else 
     { 
      return true; 
     } 

    } 


    public Cursor getData() 
    { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor res = db.rawQuery("select * from " + s, null);//* gets all in the query 
     return res; 
    } 

} 
} 

Главная XML:

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Create" 
    android:id="@+id/create" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_marginTop="55dp" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Query" 
    android:id="@+id/query" 
    android:layout_below="@+id/sqlQuery" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_marginTop="45dp" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" /> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="quit" 
    android:id="@+id/quit" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_alignRight="@+id/selectQuery" 
    android:layout_alignEnd="@+id/selectQuery" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="sql query" 
    android:id="@+id/sqlQuery" 
    android:textSize="40dp" 
    android:textStyle="bold" 
    android:layout_below="@+id/create" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="41dp" /> 

<EditText 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/selectQuery" 
    android:text="query" 
    android:layout_below="@+id/query" 
    android:layout_marginTop="56dp" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" /> 

класса, где будет отображаться информация базы данных: XML

package com.dwolford.project9; 

import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 


public class execute_query extends ActionBarActivity { 

Button back; 
String query = ""; 

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

    Bundle extras = getIntent().getExtras(); 
    if(extras == null) 
    { 
     return; 
    } 
    query = extras.getString("queryChoice"); 

    //query = getIntent().getDataString(); 

    back = (Button)findViewById(R.id.back); 
    back.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      finish(); 
     } 
    }); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_execute_query, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 
} 

запроса:

<Button 
    style="?android:attr/buttonStyleSmall" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Back" 
    android:id="@+id/back" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
    android:height="30dp" /> 

<HorizontalScrollView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/horizontalScrollView" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_above="@+id/back" 
    android:fillViewport="true" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true"> 

    <ListView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/listView" 
     android:layout_alignTop="@+id/horizontalScrollView" 

     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:layout_above="@+id/back" /> 
</HorizontalScrollView> 

+2

В первом упражнении вы создаете базу данных. Во втором действии вы можете прочитать данные, запустив экземпляр базы данных с помощью SQLiteDatabase db = this.getReadableDatabase(), а затем выполнив запрос с помощью этого экземпляра. – Passiondroid

+0

просто передайте 'Uri' вашего пользовательского' ContentProvider', используя пользовательский 'ContentProvider', даст вам некоторые преимущества: прозрачная загрузка через' CursorLoaders' и автоматическую перезагрузку при каждом изменении данных поднесущих – pskink

+0

да, вам не нужно передавать все базы данных, вы можете создать базу данных в другой деятельности. как сказал @Passiondroid. если вы хотите сделать запрос, основанный на запросе в предыдущем действии, вы можете отправить этот параметр в пакет –

ответ

1

Я думаю, что это хорошая практика, чтобы иметь подключение к базе данных как отдельный статический класс и всякий раз, когда необходимо вызывать функции из других классов внутри AsyncTask. Вызовите функцию запроса в doInBackground() и начните свою деятельность с onPostExecute(), если вам нужно.

Вот пример:

create.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

    // initialize your database here 
     db = new SQLDatabase(Main.this)   
     boolean isInserted; 
    new AsyncTask(){ 
     @Override 
     protected void onPreExecute() { 
      // do things you need to do before calling db function 
     } 

     @Override 
     protected Object doInBackground(Object[] params) { 

      //call db function here 
      isInserted = db.insertDataS("S01", "Smith", "London"); 
      //return query resul 
      return isInserted; 
     } 

     @Override 
     protected void onPostExecute(Object o) { 
      // you can get returned result here as an object and cast it 
      isInserted = (boolean)o; 
      // then start your activity here if you need to or make changes 
      // to a view or show a toast 

      Intent i = new Intent(Main.this, otherClass.class); 
      i.putExtras("result",isInserted); 
      startActivity(i); 
     } 
    }.execute(); 

Я надеюсь, что это поможет вам.

+0

Итак, чтобы создать и вставить данные в базу данных, передать контекст из основного класса в AsyncTask? У меня возникают проблемы с созданием базы данных, которую я создал во внутреннем классе, для запуска в классе AsyncTask. –

+0

см. Https://github.com/masconsult/EasyTracker/tree/master/Examples/NotePad/src/com/example/android/notepad – pskink

0

используют эту активность 1:

Intent i = new Intent(MainActivity.this,SecondActivity.class); 
i.putExtra("anyname",db.Display(2, 1)); 
startActivity(i); 

активность 2:

Intent i = getIntent(); 
    String fName = i.getStringExtra("fone"); 

    tv1.setText(fName); 

 Смежные вопросы

  • Нет связанных вопросов^_^