صفحه 1:
Programming
the Android
Kristopher Micinski, Secretary, ACM Chapter,
MSU
ACM Fall Activity Series, 2010
October 21s, 2010
صفحه 2:
Welcome!
Welcome to the first talk in
the 26 ل series for
۴۵۱۱ 2 ۳ =i)
0 0 0 م ا
lecture. But there’s pizza یر
0 عم
The goal of the Activity ت۱۱
اك ا وت
ات رات کل you
5دة مأ تا رت ۱9
ل اك ا تنا
time or don’t directly relate
.81م عط مغ
it mi Fu ISK
eee
50 301/ 01 لانا0ننا 35ع10 ناولا ۳ 5
really help for future events: | Yeudon’t get the software
= 0
اروت یات بت از 0
ا
۷۴ ۲6۵۱۷
۱
صفحه 3:
Outline of the talk
* Today we're talking about how to write applications on
the Android operating system.
توا
» What makes mobile application development different?
» A broad overview of the Android approach.
* Android programming:
» Covering the three basic classes:
٠ 5ع ا ألاناعم
cast ale}
۱3۳ یر Nes
» Example application:
۱ روت ترتع
۱۵ ار
» Hopefully you get a broad overview of the system, but
you'll have to go read about / play around with the
sample code and experiment to understand more.
صفحه 4:
560110 [1
Introduction, Mobile Programming, Android
Tale
صفحه 5:
Why is mobile
programming different?
* So why can’t we just put * Mobile devices have
increased RAM daily, so
why don’t we wait until
we have enough?
» Easy answer, we never
will
* Harder answer:
*» 5ععءمعرع]7 أل ع0 00.
ie TiC تال دا
other big companies give
you the tool chain.
» The API is restricted:
Sera eRe nC)
غلا0 ]أنه غ»اع] عن 0388 0مع5
ل
0 دی ات
Ud
ع)۷ع0 t ura)
our desktop code on a
mobile device verbatim?
۶25۷ ۵05۷۷6۲: ۵۵6
06۷۱6۵5 ۱۵۷۶ ۳۲
types 0۲ ۲65۵۷۲۵5
(RAM, long term
storage, etc...) than
your laptop.
Slightly more difficult
2۲
* The field is moving
۰ کف ON
Lae companies are
را یام ات یاه
8 Consequence: ا 6
specific to devices.
صفحه 6:
Practical Matters...
* You'll write your code in Java, and using the android API.
* It might not do everything you want!
» [had to write my own class to output DOM based XML.
» Also, it changes, your app might require the newer APIs.
۱ هرت OTe (- 4ات
» Uses Eclipse for the IDE, you might be able to get VS to
work?
٠ A few basic classes, then lots of smaller utility classes:
۱۳ لأمعلمط وس ین (6
* | strongly encourage you to do the following:
* Go through the slides in this talk first, and then the sample
application.
* Go to the Android developer documentation, and read
through the main pages / classes.
٠» Start working on your own applications, and then when
you get stuck, read the documentation
صفحه 7:
Installing the SDK
http://developer.android.com/sdk/installing.html
٠ عاعأنان ة عنذذو 11"ا غناط ,كلد هل مع عامط اتهاعل برطغومعا مأ دعطزعدع0
هن
First download Eclipse:
Bes onal ee |
Next, download the Android SDK:
Bee Meee ecu Rees eater
Unzip the SDK and run the SDK manager in the directory you
unzip, then install all of the extra required packages, etc...
۱: ge om te) Cee MU هک
lots of samples, documentation, and more!
Create a new virtual device so that you can run an emulator.
8 ا go into eclipse and download the Android developer
leo
Prcero Se isc ner nC CR rao inne ts
+ https://dl-ssl.google.com/android/eclipse/
0 tose cena Denk tiles]
You should be good to go from here! Try doing a New->Project
and selecting a sample application!
صفحه 8:
Section II
Basic Android programming overview
صفحه 9:
The Android Approach
For each distinct logical
piece of program behavior
OTR TR 8 [303 355ء
00 from a base
flO
Activities: Things the user
>80 5۵6 00 16 ۰
Basically, each different
Tu ات یات وت
Services: Code that isn’t
associated with a screen
(background, fairly
common)
60۳6۳ ۱ ۱۷۱ ۱/۱5
Provides an interface to
exchange data between
rograms (usually SQL
ased)
Beem CUCM atau)
تا
بعالا اعلوالا عط مه ل0ع5ة8 ٠
۰ و0651 020۴۲۲۵۱۱6۲
Don’t think of your program *
یت ات ات ات
Op aS
۳ ela eta)
تست
ات
* The blocks communicate
back and forth via message
passing, etc...
* Added advantage, physical
رت یر ات۳
Ie eRe esd
ا یت یا
same programming
یت
0
0] ممة عط أه كعععام أمعرع 6
cee Tr
Cee nce Ie nt
صفحه 10:
* The activity allows you to
set the top level GUI
Lally كت
1 رت ترا ناملا معط leat?
Views (widgets), put them
Rolla eda eels
35 أعلأوغاممء ع5 أع5
Activity’s top level View:
Bee oreo)
وه see eR 6
Nain ren
مه لامعل مأ هما مو دمن عللا +
كه ,قمع ومأصصقءومعم الات
لك
The Activity is loaded by
the Android OS, then the
appropriate methods are
called based on user
interaction (back button?)
Activities
Activities describe
لكل یت
حك للا omy
interacting.
Your program specifies a
top level screen that runs
upon application startup.
Each Activity performs its
own actions, to execute a
method in another
Activity use an /ntent.
"۲06 ۸۷۱۵ 355اء ععوط
22 لت ی
enough functionality to
Maeve alo
“does nothing”
See CoN RTRs
6801/35!
00
صفحه 11:
The evolution of a
Activity
۲۳6 ۸۷۷۱۵ ۱25 2
number of predefined
functions that you
override to handle
events from the system.
If you don’t specify what
should be done the
2 ۰ ات۱۱ ریت
1005غ36 غاناهاء0 0
handle events.
Why would you want to
ریت ت1۱
onPause(), etc... ?
You will probably want to
00 ع35عاع] عاذ دكوصاط
resources, stop network
...ع ینت۱
صفحه 12:
Steps to developing an
Activity
Specify a default View * ل ا تت ات لا
for the Activity.
In the onCreate
۹۹ ات set up
handlers for your
View’s actions:
۲ 0۴ ۵ اع5 «
7مغناط 5000 101
Find out what other
Activities you want to
ir] aon
When do you want to
change screens?
ما هو ,۵۵۳۵۱6 ۲۴۵۲
PassportBrowser from
DocumentDisplay.
۰ 20 وبا ۲60
your project, using
Activity as a base class.
* Then override
onCreate(),
onResume(), etc... as
you need!
* Put your Activity in the
android manifest.
0 ليك ان ا لل
specifies the different
classes in your 9 what
“لت 0 تايا Sag
interact.
]2- ob caged
Clee 6۵0 6
Eclipse to fill this out for
ناولا
صفحه 13:
User starts yo
Intents م
How does an Activity (or any
Crt aE ee UY lie)
کت ت۱0 Ed ۳۳-۳
عدن عللا eon)
ل
0 ine Kia
Sunes eee cnr
aC MC RuCl
ه) عغمهع0مه كأ كقط لاأباناعم
onResume, etc...) method
called.
ارت ییا R ا
peace erecta
یی onCreate()
0
0
0
ممع 1اممة عناملا
1ت MUR)
قت اش رتنیا
ار
|
User clicks on
an object to
edit
ba
عدوا تعمد لمع عط 6
Bs gts
ان
عناملا برط فععهدى ممه دمماع تومه
بطر نعط عب
صفحه 14:
User selects item to
download
Services
56۳۷66 0۳۵۷06 2 ۷/۵۷ ۲
your application to handle
events in the background,
without being explicitly 1 ivi
ات یت Pris a View. نات
تیا ذ5عءالااع5 ,إع لاع بالاولا 1
إلقعقط دنلده عأعطغ مأ علأوعم Activity asks
eRe (aaa Re Ld 56۳۷۱۵ 0
ال ۳
56۲۷۱6۵, ۷۵۱ ۷۱۱ ۵ رن ۳
fare هأي) معنا
ITD تام ل ليل ات انا
do?
3ك
in currently running
activity
ee 3
BV tata ما عوداه
ا ري NTR (oe <la tile
Cree Rater
٠ متهم م اعه6 الف مدع
Praia re Narula
6855
Downloading Threads (maybe thread
۱0017(
صفحه 15:
Storing long term data
* The best solution is to use
م ععوأمعاما لأمءصط عط
SQLite:
1 eee)
on SQL
Segue nese
Poesia a no
كك cele
0
* ناولا make queries to the
database in standard SQL:
ت۹1
FROM STATION WHERE
آها ۱۱ < 7”
٠ مملنوعذاممة عناملا معط
provides a handler to
Interface the SQL database
to other applications via a
content provider:
Bere et
و رد۱
مأ 038 ات رت
0100131 اناولا
ع0 وا 6۵0 ناملا
Vir Teemu}
to store simple key-value
pairs
لل
0 66 ۱۵150۵۲6۵۴۲۵۲۵۲6
then use call getString,
...عق ,8001620عو
However, you'll probably
NEU Reena
complicated storage.
تک ۱
تیا
۱
تا ات ات 0010م
storage
صفحه 16:
Content Providers
For example, let’s say
we want our content
ا oa Ls
applications to access
our database of bicycles
300 3150 515.
We define methods for
,وط۲عکطا 061609,
updating, etc... bicycles
and customers.
Then we publish two
1H
* BICYCLES URI
ل ریت۱9
Maybe more URIs for
accessing bicycles
indexed by serial
tata یی
60۳0۵۲ ۵
abstract data storage to
other applications,
1۳۶۱ ات توت رت
Again, fairly SQL based.
۱۸/۱ أعناءغكمم 3
)00۲۵۱۲۴۳۵۷۱۵۵۲ ووجا)
تور
methods such as
insert(), delete(), and
update().
Then you register your
content provider with a
URI to handle different
types of objects.
BU ean ieN tag
(kind of like a URL)
صفحه 17:
So, how do I design my
* Think about what
background Services you
ا iatecela stele oe
۱2
0 ل tet ants
eee NASM et ae
ی ی یناکت را
ریت ۳
* Think about what
information must be
stored in long term
memory and design a
content provider around
it.
baa oN more lat =Leimi sal}
۱۵ ۹۳ ( رهز (etre ...عع
Tita) cha
* Don’t forget good OOP ©
* عط1 Co aS) 218-1
architecture is set up if
fairly open:
See aan
somewhat up to you, but
‘ou still have to live with
۱۳ ۱
model.
لل ات لل تل كت
screens that the user
خلركا ا ححا اننا
اج ۸۲۷۵۵5 01۲۲6۲6۲
will comprise your
Vaca
Think about the
عط دمع نمع ار رتیل ید۱
screens, these will be the
intents passed between
.5ع أ/اتاعم عا
صفحه 18:
Section III
Sample Application: MSU Cafeteria Menu
وح كينا
صفحه 19:
Designing our first
Android App
* We want to design an application to view the menus
for the MSU cafeterias.
* What is involved with this? What objects do we have
to deal with?
ری iL}
۰ ۸۵ داعاهآی
» An internet connection?
+ For this application, I’m going to use the ListActivity:
* This is an Activity with a top level container to display a
۱8 باع هعم موء معدن رش رل
۰ What background services are we going to need
لتكتلا
« I'm just going to use a thread here, not enough work to
set up an activity
صفحه 20:
What type of input do
we have?
* Let’s visit http://www.eatatsate.com to find out!
٠ علالا a عع مانام 3 غععاع5 مقع علا أهطغ ععد 06
different cafeterias:
« Probably going to stick with this interface, so the main
Activity of our application will let us select cafeterias.
* With each of those cafeterias we see that we can
have a number of different stations:
» So down in the hierarchy the user will select the
station in which they are interested.
* For each cafeteria we have an RSS feed describing
the current cafeteria menu.
» So we'll need to keep track of what cafeterias go with
what RSS feeds (URLS)
صفحه 21:
eas
tations link in
browser.
download meu in
ferent)
Rear e ee
مه كاعذاء معدلا
تفت ةا
عا مومع
وعاقعى
که اه زناه
۱۰۱۵ عفده)رروو
eee
ماه عطا من 6)
rere
عا جععتوم مونعهه
ey
1
صفحه 22:
What next?
What should you do now?
Go download the Android SDK, even if you don’t have an
PUM eee eet ee
Then download the sample application and go through. Set
breakpoints at onCreate() and onResume() on the main
.که )201۷
مغ وماغوءأصنتصصمم وم ابعل وبنط وبطعل معنك مق نهل مع ووبطعل عءألر +
Ng یا کارت
۱۹/۰ in the documentation and read the docs on the classes |
زیت خلت یا
Be careful, pressing “next” in the debugger doesn’t always
mean you will go to the next line. Sometimes you will fall into
an Android binary class, so set lots of breakpoints.
Now try to modify the demo application:
* Add caching!
Se ما تپ RRC Rae ela
ایلاتیا eR Relea Cue ا aon
Cre roe
Se CCM a eck creer ke eet eM yt
Fer asl ۱ کت وین وتات زا یت رک ت رت eal]
كان
صفحه 23:
Thanks!
٠ Thanks for coming to the first in the ACM Activity
Tat
* Maybe some still free pizza, grab some.
* Be sure to talk to me and tell me if you had any
comments or questions
» Also, we're going to use the ACM Listserv to support
0۳ عع ۱۳۰
06 > ۲۸5 ۰ . ۳۳
5
Programming
the Android
Kristopher Micinski, Secretary, ACM Chapter,
MSU
ACM Fall Activity Series, 2010
October 21st, 2010
Welcome!
• Welcome to the first talk in
the ACM Activity series for
Fall 2010:
• Okay, so this one is more of a
lecture. But there’s pizza
over there.
• The goal of the Activity
series is to cover topics that
you might be interested in,
but won’t cover in class
because they take too much
time or don’t directly relate
to the material.
• So any of your ideas would
really help for future events:
• LaTeX?
• Linux kernel internals.
• How does your toolchain
really work?
• An introduction to F#.
Believe it or not, when you
search Google for LaTeX,
you don’t get the software
package…
Outline of the talk
• Today we’re talking about how to write applications on
the Android operating system.
• First:
• What makes mobile application development different?
• A broad overview of the Android approach.
• Android programming:
• Covering the three basic classes:
• Activities
• Services
• Content providers
• Example application:
• MSU Cafeteria menus
• What should I take out of the talk?
• Hopefully you get a broad overview of the system, but
you’ll have to go read about / play around with the
sample code and experiment to understand more.
Section I
Introduction, Mobile Programming, Android
overview
Why is mobile
programming different?
• So why can’t we just put
our desktop code on a
mobile device verbatim?
• Easy answer: mobile
devices have different
types of resources
(RAM, long term
storage, etc…) than
your laptop.
• Slightly more difficult
answer:
• The field is moving
quickly, driven by
industry, companies are
driven by time to market.
• Consequence: APIs are
specific to devices.
• Mobile devices have
increased RAM daily, so
why don’t we wait until
we have enough?
• Easy answer, we never
will
• Harder answer:
• Other differences too.
• Device manufacturers or
other big companies give
you the tool chain.
• The API is restricted:
• Don’t want a program to
send data or text without
your knowledge!
• User interaction is
different on a mobile
device (small screen?)
Practical Matters…
• You’ll write your code in Java, and using the android API.
• It might not do everything you want!
• I had to write my own class to output DOM based XML.
• Also, it changes, your app might require the newer APIs.
• The SDK, emulator, etc... Is all free!
• Uses Eclipse for the IDE, you might be able to get VS to
work?
• A few basic classes, then lots of smaller utility classes:
• Some classes are Android specific
• I strongly encourage you to do the following:
• Go through the slides in this talk first, and then the sample
application.
• Go to the Android developer documentation, and read
through the main pages / classes.
• Start working on your own applications, and then when
you get stuck, read the documentation
Installing the SDK
• http://developer.android.com/sdk/installing.html
• Describes in lengthy detail how to do this, but I’ll give a quick
overview.
• First download Eclipse:
• http://www.eclipse.org/
• Next, download the Android SDK:
• http://developer.android.com/sdk/index.html
• Unzip the SDK and run the SDK manager in the directory you
unzip, then install all of the extra required packages, etc…
• Be sure to poke around in the SDK directory, there are
lots of samples, documentation, and more!
• Create a new virtual device so that you can run an emulator.
• Then go into eclipse and download the Android developer
tools:
• Go to Help->Install new software… and add the following URL
• https://dl-ssl.google.com/android/eclipse/
• Now add a new name (just make one up?) and download
• You should be good to go from here! Try doing a New->Project
and selecting a sample application!
Section II
Basic Android programming overview
The Android Approach
• Based on the Model View
Controller design pattern.
• Don’t think of your program
as a linear execution model:
• Think of your program as
existing in logical blocks, each
of which performs some
actions.
• The blocks communicate
back and forth via message
passing, etc…
• Added advantage, physical
user interaction (screen
clicks) and inter process
interaction can have the
same programming
interface
• Also the scheduler can bring
different pieces of the app to
life depending on memory
needs and program use
• For each distinct logical
piece of program behavior
you’ll write a Java class
(derived from a base
class).
• Activities: Things the user
can see on the screen.
Basically, each different
screen in your program.
• Services: Code that isn’t
associated with a screen
(background, fairly
common)
• Content providers:
Provides an interface to
exchange data between
programs (usually SQL
based)
• Kind of vague, but we’ll given
an example.
Activities
• Activities describe
individual screens with
which a user could be
interacting.
• Your program specifies a
top level screen that runs
upon application startup.
• Each Activity performs its
own actions, to execute a
method in another
Activity use an Intent.
• The Activity base class
already provides you with
enough functionality to
have a screen which
“does nothing”
• Provides you with an empty
canvas!
• No pun intended…
• The activity allows you to
set the top level GUI
container.
• Then you instantiate some
Views (widgets), put them
in a container View, and
set the container as the
Activity’s top level View:
• This is what gets displayed
on the screen when the
Activity is running.
• We won’t go too in depth on
GUI programming here, lots
of documentation.
• The Activity is loaded by
the Android OS, then the
appropriate methods are
called based on user
interaction (back button?)
The evolution of a
Activity
• The Activity has a
number of predefined
functions that you
override to handle
events from the system.
• If you don’t specify what
should be done the
system will perform the
default actions to
handle events.
• Why would you want to
handle events such as
onPause(), etc… ?
• You will probably want to
do things like release
resources, stop network
connections, etc…
Steps to developing an
Activity
• Create a new class in
your project, using
Activity as a base class.
• Then override
onCreate(),
onResume(), etc… as
you need!
• Put your Activity in the
android manifest:
• This is a file that
specifies the different
classes in your app, what
they do, and how they
interact.
• Easiest to see examples
of this, or you can use
Eclipse to fill this out for
you.
• Specify a default View
for the Activity.
• In the onCreate
(usually) you set up
handlers for your
View’s actions:
• Set an onClick handler
for some button?
• Find out what other
Activities you want to
talk to:
• When do you want to
change screens?
• For example, go to
PassportBrowser from
DocumentDisplay.
• Then use an Intent…
Intents
Intent object to
start the
EditContent Activity
onRestart() onCreate()
User starts your app!
• How does an Activity (or any
other runnable Android
object) get started?
• We use the Intent class to
ask the Android OS to start
some Activity, Service, etc…
• Then the OS schedules that
Activity to run, and that
Activity has its onCreate (or
onResume, etc…) method
called.
• Intents are used to represent
most inter-process requests
in Android:
• Dialing a number
• Sending a text
• Starting a new Activity within
your application
• So the system will generate
Intents, and so will your
app!
setClass()
BrowseConte
nts Running
New()
Intent object to
start the
EditContent Activity
User clicks on
an object to
edit
onCreate()
User clicks
back
EditContent
button
running
Notice! Here the red transitions
are the events initiated by the
Android OS, and the green
transitions are created by your
User selects item to
download
Services
• Services provide a way for
your application to handle
events in the background,
without being explicitly
associated with a View.
• However, services don’t
reside in their own thread!
• So don’t perform things like
network connections in a
service, you will block the
main thread!
• However, what can you
do?
onButtonClick() called
in currently running
activity
Main Activity
Activity asks
Service to
download
specific item (via
Servicean intent!)
• Use your Service class to
Done downloading!
provide an interface to a (new WorkerThread()).start()
background thread
• Can call back to main
activity using a Handler
class
New worker
Worker Thread
thread
(downloading)
Downloading Threads (maybe thread
pool?)
Storing long term data
• Eventually you’ll want to
store long term data in
your program.
• You can use the
SharedPreferences class
to store simple key-value
pairs
• Simple interface, call
getSharedPreferences and
then use call getString,
getBoolean, etc…
• However, you’ll probably
want to use more
complicated storage.
• Android provides an SQLite
interface
• Also ContentProviders
provide inter process data
storage
• The best solution is to use
the Android interface to
SQLite:
• Lightweight database based
on SQL
• Fairly powerful, can’t notice
the difference between
SQLite and SQL unless you
have a large database
• You make queries to the
database in standard SQL:
• “SELECT ID, CITY, STATE
FROM STATION WHERE
LAT_N > 39.7;”
• Then your application
provides a handler to
interface the SQL database
to other applications via a
content provider:
• Look at an example!
Content Providers
• Content providers
abstract data storage to
other applications,
activities, services, etc…
• Again, fairly SQL based.
• You will construct a
ContentProvider class
that will override
methods such as
insert(), delete(), and
update().
• Then you register your
content provider with a
URI to handle different
types of objects.
• Unique Resource Identifier
(kind of like a URL)
• For example, let’s say
we want our content
provider to allow other
applications to access
our database of bicycles
and also customers.
• We define methods for
inserting, deleting,
updating, etc… bicycles
and customers.
• Then we publish two
URIs:
• BICYCLES_URI
• CUSTOMERS_URI
• Maybe more URIs for
accessing bicycles
indexed by serial
number?
So, how do I design my
program?
• The way the system
architecture is set up if
fairly open:
• Think about what
background Services you
need to incorporate.
• Start with the different
screens that the user
will see. These are the
different Activities that
will comprise your
system.
• Think about the
transitions between the
screens, these will be the
Intents passed between
the Activities.
• Think about what
information must be
stored in long term
memory and design a
content provider around
it.
• Now connect the
Activities, services, etc…
with Intents!
• Don’t forget good OOP
• Program design is
somewhat up to you, but
you still have to live with
the Android execution
model.
• Exchanging data
• Listening for connections?
• Periodically downloading
network information from
a server?
Section III
Sample Application: MSU Cafeteria Menu
Browser
Designing our first
Android App
• We want to design an application to view the menus
for the MSU cafeterias.
• What is involved with this? What objects do we have
to deal with?
• A menu
• A cafeteria
• An internet connection?
• For this application, I’m going to use the ListActivity:
• This is an Activity with a top level container to display a
list with which the user can interact.
• What background services are we going to need
here?
• I’m just going to use a thread here, not enough work to
set up an activity
What type of input do
we have?
• Let’s visit http://www.eatatsate.com to find out!
• We can see that we can select a number of
different cafeterias:
• Probably going to stick with this interface, so the main
Activity of our application will let us select cafeterias.
• With each of those cafeterias we see that we can
have a number of different stations:
• So down in the hierarchy the user will select the
station in which they are interested.
• For each cafeteria we have an RSS feed describing
the current cafeteria menu.
• So we’ll need to keep track of what cafeterias go with
what RSS feeds (URLS)
Android
Browser
Our program design
User selects station to
browse, navigate to
that stations link in
browser.
User clicks on
cafeteria to
browse
CafeteriaBrow
MainScreen
ser
(Activity) Intent: passes cafeteria name and URL
(Activity)
1
Downloading Complete! (Message)
onResume() create
a new thread to
download menu in
the background
Fetch the list of cafeterias in the databaseMenuDownloadi
ngThread
CafeteriasCont
entProvider
New()
Downloads the XML from the
URL, parses it, and creates a
fills up the Cafeteria object as
needed.
(What design pattern is
CafeteriaMe
this?)
nuDownload
er
Cafeteria
1
*
CafeteriaStatio
n
browsingCafeteria
What next?
• What should you do now?
• Go download the Android SDK, even if you don’t have an
android phone this can still be fun!
• Then download the sample application and go through. Set
breakpoints at onCreate() and onResume() on the main
activities.
• Nice debugger. You can even debug two devices communicating to
each other at the same time over Bluetooth on the same computer!
• Dig around in the documentation and read the docs on the classes I
mentioned.
• Be careful, pressing “next” in the debugger doesn’t always
mean you will go to the next line. Sometimes you will fall into
an Android binary class, so set lots of breakpoints.
• Now try to modify the demo application:
• Add caching!
• Create a “add new cafeteria” Activity that allows you to enter a title
and URL of the RSS feed for cafeterias and add new ones to the
database.
• Add a way to delete cafeterias from the database, maybe
automatically delete them after the connection does not work for a
while?
Thanks!
• Thanks for coming to the first in the ACM Activity
series!
• Maybe some still free pizza, grab some.
• Be sure to talk to me and tell me if you had any
comments or questions
• Also, we’re going to use the ACM Listserv to support
answers to questions for these events. Send your
questions there.
• Join the MSU ACM Chapter!